jDatabase是否可以一次插入多个记录?


11

Joomla数据库函数可以使用这样的SQL语句来代替使用循环吗?

INSERT INTO #__tablename (col1,col2)
VALUES 
 ('1', 'one'),
 ('2', 'two'),
 ('3', 'three'),
...
 ('999', 'three'),

使用JDatabase访问数据库的文档参考了Transactions以及使用SQL或Objects,但是在两种情况下都没有提及多个值。

Answers:


12

这可以通过使用->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")

3

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

0

添加到@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);
...

您能否解释@GDP接受的答案中尚未涵盖的答案中的值?这几乎是仅代码的答案。
mickmackusa

它显示了如何以编程方式填充$values变量comma separated row strings,从而节省了大量时间并降低了出错率,而不是像在他的答案中那样手动创建逗号分隔的字符串,或者甚至对此进行串联。
Mohd Abdul Mujib

这些信息应打包到您的答案中,以便可以教育未来的研究人员。
mickmackusa

好吧,我认为是这样,只要代码可以很容易地说明问题,尽管可以肯定会有改进的地方,如果您认为这样,请随时编辑和增强答案
Mohd Abdul Mujib

对于那些了解php / Joomla语法含义的人来说,您的代码是不言自明的。您不喜欢完善自己的作品吗?在JSX上(不仅仅是Stackoverflow),充分解释答案非常重要,因为CMS诱使刚开始从事Web开发事业的人们这样做。您确实意识到在这里发布内容的重点是教育,对吗?我的意思是,我鼓励您发布最佳答案,并冒险赢得投票。
mickmackusa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.