¿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.

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")

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

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

¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.