Joomla数据库函数可以使用这样的SQL语句来代替使用循环吗?
INSERT INTO #__tablename (col1,col2)
VALUES
('1', 'one'),
('2', 'two'),
('3', 'three'),
...
('999', 'three'),
使用JDatabase访问数据库的文档参考了Transactions以及使用SQL或Objects,但是在两种情况下都没有提及多个值。
Joomla数据库函数可以使用这样的SQL语句来代替使用循环吗?
INSERT INTO #__tablename (col1,col2)
VALUES
('1', 'one'),
('2', 'two'),
('3', 'three'),
...
('999', 'three'),
使用JDatabase访问数据库的文档参考了Transactions以及使用SQL或Objects,但是在两种情况下都没有提及多个值。
Answers:
这可以通过使用->insert()
和来实现->values()
,其中和$values
是要插入的字符串数组。
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$columns = array('col_one','col_two');
$values = array();
// Proper escaping/quotes should be done here, and probably in a loop, but cluttered the answer, so omitted it
$values[] = '1, "one"';
$values[] = '2, "two"';
$values[] = '3, "three"';
$values[] = '999, "nineninetynine"';
$query->insert($db->quoteName('#__tablename'));
$query->columns($columns);
$query->values($values);
$db->setQuery($query);
$db->query();
使用产生的SQL echo $query->dump()
INSERT INTO `xyz_tablename`
(col_one,col_two) VALUES
(1, "one"),(2, "two"),(3, "three),(999, "nineninetynine")
Joomla核心支持基本的SQL查询。您可以创建一个用于存储多个插入的类,并创建一个最终查询以在末尾执行单个插入。
public function flushInserts()
{
$db = JFactory::getDbo();
foreach ($this->bulk_tables as $table)
{
// No inserts
if (!array_key_exists($table, $this->bulk_inserts))
{
continue;
}
$tableq = $db->qn($table);
$insertSet = $this->bulk_inserts[$table];
$values = implode(',', $insertSet);
$query = 'INSERT INTO ' . $tableq . ' VALUES ' . $values . ';';
$db->setQuery($query);
$db->execute();
if ($error = $db->getErrorMsg())
{
throw new Exception($error);
}
}
$this->bulk_inserts = array();
}
添加到@GDP的答案
...
$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);
...
$values
变量comma separated row strings
,从而节省了大量时间并降低了出错率,而不是像在他的答案中那样手动创建逗号分隔的字符串,或者甚至对此进行串联。