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.

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

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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.