Чи можна вставити відразу декілька записів за допомогою jDatabase?


11

Чи можуть замість використання циклу використовувати бази даних Joomla створювати такий SQL-оператор?

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

Документи в Доступ до бази даних за допомогою JDatabase , посилаються на Операції та використання SQL або Об'єктів, але в жодному випадку не згадують про декілька значень.

Відповіді:


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

Додавання до відповіді @ ВВП

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

Чи можете ви пояснити значення у своїй відповіді, яке вже не охоплене прийнятою відповіддю @ ВВП? Це майже відповідь лише на код.
mickmackusa

Він показує, як заповнити $valuesзмінну масивом comma separated row stringsпрограмно, що економить багато часу та має менший запас помилок, а не вручну створювати відокремлені комами рядки, як у його відповіді або навіть поєднувати з цього питання.
Мохд Абдул Муджіб

Ця інформація повинна бути упакована у вашу відповідь, щоб вона могла навчати майбутніх дослідників.
mickmackusa

Що ж, як я вважаю, за умови, що код досить зрозумілий, хоча, напевно, можуть бути вдосконалення, якщо ви вважаєте, що так, будь ласка, не соромтесь відредагувати та покращити відповідь
Мохд Абдул Муджіб

Ваш код зрозумілий для тих, хто розуміє, що означає синтаксис php / Joomla. Вам не подобається вдосконалювати власну роботу? У JSX (більше, ніж Stackoverflow) повне пояснення відповідей є великим значенням, оскільки люди, які тільки починають кар'єру у веб-розробці, закликають це зробити CMS. Ви розумієте, що сенс розміщення вмісту тут - це освіта, правда? Я маю на увазі, я закликаю вас опублікувати свою найкращу відповідь і ризикувати заробляти гроші.
mickmackusa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.