使用单个查询插入多行数据

9

Joomla的DB对象能否一次添加多行数据?MySQL可以通过以下方式实现:

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

但是,Joomla的内置函数能否通过单个查询实现相同的功能呢?目前我正在使用循环将每一行(相同的表)插入到单独的查询中。处理大量数据时不是一个好主意。


2
你是如何在Joomla中插入它的? - Gaurav
使用Jtable实例,将$data存储到'tablename'表中:$this->store($data,'tablename') - exentric
7个回答

7
在你的模型中,你可以这样做:
$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的存在自动选择。 - exentric
我以为你说你必须执行2个单独的查询INSERT和UPDATE。那么为什么JTable要选择呢?它肯定也需要执行INSERT和UPDATE,除非你没有提到你想要做什么的某些内容。 - Martin

6

您可以使用:

$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();

如果您有自增ID,$db->insertId()可以返回给您。


我已经纠正了答案,并进行了测试,使用的是 $query->columns 和 $query->values,因为最初的方法是错误的。 - Valentin Despa
这个方法在处理少量数据时表现非常好,但如果你要处理上千行的数据,我建议使用Martin在前面提供的更高效的解决方案。 - Anriëtte Myburgh

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();

2

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

只需使用以下代码:

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

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

2
在最新版本的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();

希望这能节省您的时间。谢谢。愉快编码! :)

2

试试这个:

$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();

“values”方法的说明

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


0
...
$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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接