Вставить несколько строк с помощью одного запроса - PullRequest
8 голосов
/ 08 апреля 2011

Может ли объект БД Joomla добавить несколько строк одновременно? MySQL может сделать это так:

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

Но могут ли собственные функции Joomla достичь одного и того же в одном запросе? В настоящее время я делаю цикл для вставки каждой строки (той же таблицы) в отдельный запрос. Не очень хорошая идея, когда приходится иметь дело с тоннами строк одновременно.

Ответы [ 7 ]

7 голосов
/ 08 апреля 2011

В вашей модели вы можете сделать это:

$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();
6 голосов
/ 03 апреля 2012

Вы можете использовать:

$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, если он у вас есть.

5 голосов
/ 16 марта 2013

Попробуйте, если у вас есть значения в массиве:

$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 голосов
/ 13 октября 2014

В последней версии Joomla !, вы можете использовать собственный класс БД следующим образом. Не забудьте использовать функции «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 голосов
/ 11 марта 2013

Попробуйте это:

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

2 голосов
/ 19 марта 2012

Вам не нужно $db = $this->getDBO();

просто используйте это: -

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

$this->_db->setQuery($query);
$this->_db->query();
0 голосов
/ 24 июля 2018
...
$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();
...