【问题标题】:Insert multiple rows using a single query使用单个查询插入多行
【发布时间】:2011-08-01 06:45:29
【问题描述】:

Joomla 的 DB 对象可以一次添加多行吗? MySQL 可以这样做:

INSERT INTO x (a,b)
VALUES 
 ('1', 'one'),
 ('2', 'two'),
 ('3', 'three')

但是 Joomla 自己的函数可以在单个查询中实现相同的功能吗?目前我正在做一个循环以在单独的查询中插入每一行(同一个表)。一次处理大量行时不是一个好主意。

【问题讨论】:

  • 你是如何将它插入到 Joomla 中的?
  • $this->store($data,'tablename') - 使用 Jtable 实例

标签: joomla joomla1.5 joomla2.5 joomla-dbo


【解决方案1】:

在您的模型中,您可以这样做:

$db = $this->getDBO();
$query = "
  INSERT INTO x (a,b)
  VALUES 
  ('1', 'one'),
  ('2', 'two'),
  ('3', 'three')
";
$db->setQuery($query);
$db->query();

如果您在模型之外,则需要像这样获取 DB 对象:

$db = JFactory::getDBO();

【讨论】:

  • 是的,这就是我所做的。问题是,我必须对 INSERT 和 UPDATE 执行两个单独的查询。使用 JTable 实例,它将根据 PRIMARY KEY 的存在自动选择。
  • 我以为您说您必须执行 2 个单独的查询 INSERT 和 UPDATE。那么JTable为什么要选择呢?当然,它还需要同时执行 INSERT 和 UPDATE,除非您没有提及您想要做什么。
【解决方案2】:

你不需要$db = $this->getDBO();

就用这个吧:-

$query = "
  INSERT INTO x (a,b)
  VALUES 
  ('1', 'one'),
  ('2', 'two'),
  ('3', 'three')
";

$this->_db->setQuery($query);
$this->_db->query();

【讨论】:

    【解决方案3】:

    你可以使用:

    $db = JFactory::getDbo();
    $query = $db->getQuery(true); // !important, true for every new query
    
    $query->insert('#__table_name'); // #__table_name = databse prefix + table name
    $query->set('`1`="one"');
    $query->set('`2`="two"');
    $query->set('`3`="three"');
    /* or something like this:
    $query->columns('`1`,`2`,`3`');
    $query->values('"one","two","three"');
    */
    
    $db->setQuery($query);
    $db->query();
    

    如果你有,$db->insertId() 可以返回你的 autoinc id。

    【讨论】:

    • 我已经更正了使用 $query->columns, $query->values 测试的答案,因为它最初是错误的。
    • 这很好用,除非你在 1000 行上尝试,否则我宁愿建议 Martin 的解决方案以提高效率。
    【解决方案4】:

    试试这个:

    $db = JFactory::getDbo();
    $query = $db->getQuery(true);
    
    $query->insert('x');
    $query->columns('a,b');
    $query->values('1', 'one');
    $query->values('2', 'two');
    $query->values('3', 'three');
    
    $db->setQuery($query);
    $db->query();
    

    “值”方法的描述

    添加一个元组或元组数组,用作 INSERT INTO 语句的值。
    用法:
    $query->values('1,2,3')->values('4,5,6');
    $query->values(array('1,2,3', '4,5,6'));

    【讨论】:

      【解决方案5】:

      如果数组中有值,试试这个:

      $query = $this->db->getQuery(true);
      $query->insert($this->db->quoteName('#__table_name'));
      $query->columns($this->db->quoteName(array('col_1','col_2','col_3','col_4')));
      
      for($i=0; $i < lengthOfArray; $i++)
      {
          $values= $arr_1[$i].','.$this->db->quote($arr_2[$i]).','.$this->db->quote($arr_3[$i]).','. $arr_4[$i];
          $query->values($values);
      }
      $this->db->setQuery($query);
      $result = $this->db->query();
      

      【讨论】:

        【解决方案6】:

        在最新版本的 Joomla! 中,您可以使用它自己的 DB 类,如下所示。记得根据需要使用 'quoteName()' 和 'quote()' 函数。

        $dbo = JFactory::getDbo();
        $query = $dbo->getQuery(true);
        
        $columns = array('col_one','col_two', 'col_three');
        $values = array();
        
        //if you need, here you can use forloop/foreach loop to populate the array
        $values[] = 'val_1, val_2, val_3'; // first row values
        $values[] = 'val_4, val_5, val_6'; // second row values
        ...
        
        $query->insert($dbo->quoteName('#__table_name'));
        $query->columns($columns);
        
        $query->values($values);
        
        $dbo->setQuery($query);
        $dbo->query();
        

        希望这可以节省您的时间。谢谢。快乐编码! :)

        【讨论】:

          【解决方案7】:
          ...
          $columns = array('user_id', 'type', 'object', 'lvl', 'date');
          $values  = array();
          foreach ($batch as $row) {
              $array    = array(
                  $row->user_id,
                  $db->quote($row->type),
                  $db->quote($row->object),
                  $db->quote($row->lvl),
                  $db->quote($row->date),
              );
              $values[] = implode(',', $array);
          }
          $query->insert($db->quoteName('#activity_log'));
          $query->columns($db->quoteName($columns));
          $query->values($values);
          
          $db->setQuery($query);
          $result = $db->execute();
          

          【讨论】:

            猜你喜欢
            • 2011-03-17
            • 2013-11-06
            • 1970-01-01
            • 2023-03-28
            • 2013-10-31
            • 2019-10-04
            • 2013-05-08
            • 1970-01-01
            相关资源
            最近更新 更多