È possibile inserire più record contemporaneamente con jDatabase?


11

Invece di utilizzare un ciclo, le funzioni del database Joomla possono creare un'istruzione SQL come questa?

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

I documenti in Accesso al database tramite JDatabase fanno riferimento a Transazioni e utilizzo di SQL o Oggetti, ma in nessun caso si parla di più valori.

Risposte:


12

Questo può essere realizzato usando ->insert()e ->values(), $valuesessendo un array di stringhe con le colonne da inserire.

$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 prodotto utilizzando echo $query->dump()

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

3

Il core di Joomla supporta query SQL di base. È possibile creare una classe per archiviare diversi inserti e creare una singola query finale per eseguire un singolo inserimento alla fine.

    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

Aggiungendo alla risposta di @ PIL

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

Puoi spiegare il valore nella tua risposta che non è già coperto dalla risposta accettata da @ GDP? Questa è quasi una risposta di solo codice.
mickmackusa

Mostra come popolare la $valuesvariabile con una matrice di comma separated row stringsprogrammaticamente, il che consente di risparmiare molto tempo e ha un margine inferiore per gli errori, piuttosto che creare manualmente le stringhe separate da virgola come nella sua risposta o addirittura concatenare quell'argomento.
Mohd Abdul Mujib,

Queste informazioni dovrebbero essere inserite nella risposta in modo che possano educare i futuri ricercatori.
mickmackusa

Bene, per come la vedo io, a condizione che il codice sia abbastanza autoesplicativo, anche se sicuramente ci possono essere aree di miglioramento, se lo pensi, sentiti libero di modificare e migliorare la risposta
Mohd Abdul Mujib

Il tuo codice si spiega da sé per coloro che comprendono il significato della sintassi php / Joomla. Non ti piace perfezionare il tuo lavoro? Su JSX (più di Stackoverflow) spiegare in modo completo le risposte è di fondamentale importanza perché le persone che stanno appena iniziando una carriera nello sviluppo web sono invitate a farlo dal CMS. Ti rendi conto che il punto di pubblicare contenuti qui è educare, giusto? Voglio dire, ti sto incoraggiando a pubblicare la tua migliore risposta e rischiare di guadagnare voti.
mickmackusa
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.