Vários registros podem ser inseridos de uma só vez com o jDatabase?

11

Em vez de usar um loop, as funções de banco de dados do Joomla podem criar uma instrução SQL como esta?

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

Os documentos em Acessando o banco de dados usando JDatabase , referem-se a Transações e usando SQL ou Objetos, mas nenhuma menção a vários valores em ambos os casos.

PIB
fonte

Respostas:

12

Isso pode ser feito usando ->insert()e ->values(), $valuessendo uma matriz de cadeias com as colunas a serem inseridas.

$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 é produzido usando echo $query->dump()

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

O núcleo do Joomla suporta consultas SQL básicas. Você pode criar uma classe para armazenar várias inserções e criar uma única consulta final para executar uma única inserção no 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
fonte
0

Adicionando à resposta do @ 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
fonte
Você pode explicar o valor da sua resposta que ainda não está coberto pela resposta aceita pelo @ GDP? Essa é quase uma resposta apenas de código.
Mickmackusa
Ele mostra como preencher a $valuesvariável com uma matriz de forma comma separated row stringsprogramática, o que economiza muito tempo e possui menor margem para erros, em vez de criar manualmente as seqüências separadas por vírgula como em sua resposta ou mesmo concatenar.
Mohd Abdul Mujib
Essas informações devem ser incluídas na sua resposta para que possam educar futuros pesquisadores.
Mickmackusa
Bem, a maneira que eu vejo é, código fornecido é bastante auto-explicativo, embora certamente pode haver áreas de melhoria, se você pensa assim sinta-se livre para editar e melhorar a resposta
Mohd Abdul Mujib
Seu código é auto-explicativo para quem entende o que significa a sintaxe php / Joomla. Você não gosta de refinar seu próprio trabalho? No JSX (mais do que o Stackoverflow), a explicação completa das respostas é de extrema importância, porque as pessoas que estão iniciando uma carreira no desenvolvimento da Web são atraídas pelo CMS. Você percebe que o objetivo de postar conteúdo aqui é educar, certo? Quero dizer, estou incentivando você a publicar sua melhor resposta e correr o risco de ganhar votos.
Mickmackusa