Insert multiple rows using a single query

2019-04-25 09:06发布

Can Joomla's DB object add multiple rows at once? MySQL can do this like so:

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

But can Joomla's own functions achieve the same thing in a single query? Currently I am doing a loop to insert each row (same table) in separate query. Not a good idea when dealing with tons of rows at once.

7条回答
闹够了就滚
2楼-- · 2019-04-25 09:32

In your model you can do this:

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

If you are outside your model you need to get the DB object like so:

$db = JFactory::getDBO();
查看更多
太酷不给撩
3楼-- · 2019-04-25 09:46
...
$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();
查看更多
做自己的国王
4楼-- · 2019-04-25 09:50

You can use:

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

and $db->insertId() can return you autoinc id if you have one.

查看更多
你好瞎i
5楼-- · 2019-04-25 09:54

You don't need $db = $this->getDBO();

just use this:-

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

$this->_db->setQuery($query);
$this->_db->query();
查看更多
冷血范
6楼-- · 2019-04-25 09:55

Try this:

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

A description of "values" method

Adds a tuple, or array of tuples that would be used as values for an INSERT INTO statement.
Usage:
$query->values('1,2,3')->values('4,5,6');
$query->values(array('1,2,3', '4,5,6'));

查看更多
叛逆
7楼-- · 2019-04-25 09:56

Try this, if you have values in an array :

$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();
查看更多
登录 后发表回答