¿Se pueden insertar múltiples registros de una vez con jDatabase?

11

En lugar de usar un bucle, ¿pueden las funciones de la base de datos de Joomla crear una declaración SQL como esta?

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

Los documentos en Acceso a la base de datos usando JDatabase , se refieren a Transacciones y usando SQL u Objetos, pero no se mencionan valores múltiples en ninguno de los casos.

PIB
fuente

Respuestas:

12

Esto se puede lograr mediante el uso de ->insert()y ->values(), al $valuesser una matriz de cadenas con las columnas para insertar.

$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 que se produce usando echo $query->dump()

INSERT INTO `xyz_tablename`
(col_one,col_two) VALUES 
(1, "one"),(2, "two"),(3, "three),(999, "nineninetynine")
PIB
fuente
3

Joomla core admite consultas SQL básicas. Puede crear una clase para almacenar varias inserciones y crear una única consulta final para ejecutar una sola inserción al final.

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

Agregando a la respuesta de @ 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);
...
Mohd Abdul Mujib
fuente
¿Puede explicar el valor en su respuesta que no está cubierto por la respuesta aceptada de @ GDP? Esta es casi una respuesta de solo código.
mickmackusa
Muestra cómo llenar la $valuesvariable con una matriz de comma separated row stringsprogramación, lo que ahorra mucho tiempo y tiene un margen de error más bajo, en lugar de crear manualmente las cadenas separadas por comas como en su respuesta o incluso concatenar para ese asunto.
Mohd Abdul Mujib
Esta información debe incluirse en su respuesta para que pueda educar a los futuros investigadores.
mickmackusa
Bueno, tal como lo veo, siempre que el código se explique por sí mismo, aunque seguramente puede haber áreas de mejora, si lo cree, no dude en editar y mejorar la respuesta
Mohd Abdul Mujib
Su código se explica por sí mismo para aquellos que entienden lo que significa la sintaxis de php / Joomla. ¿No te gusta refinar tu propio trabajo? En JSX (más que Stackoverflow), la explicación completa de las respuestas es muy importante porque las personas que recién comienzan una carrera en desarrollo web se sienten atraídas por el CMS. Te das cuenta de que el objetivo de publicar contenido aquí es educar, ¿verdad? Quiero decir, te animo a que publiques tu mejor respuesta y te arriesgues a ganar votos positivos.
mickmackusa