Können mit der jDatabase mehrere Datensätze gleichzeitig eingefügt werden?

11

Können Joomla-Datenbankfunktionen anstelle einer Schleife eine solche SQL-Anweisung erstellen?

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

Die Dokumente unter Zugriff auf die Datenbank mit JDatabase beziehen sich auf Transaktionen und die Verwendung von SQL oder Objekten, erwähnen jedoch in beiden Fällen nicht mehrere Werte.

BIP
quelle

Antworten:

12

Dies kann erreicht werden, indem ->insert()und verwendet wird ->values(), wobei $valueses sich um ein Array der Zeichenfolgen mit den einzufügenden Spalten handelt.

$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, das mit erstellt wird echo $query->dump()

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

Joomla Core unterstützt grundlegende SQL-Abfragen. Sie können eine Klasse zum Speichern mehrerer Einfügungen erstellen und eine einzelne endgültige Abfrage erstellen, um am Ende eine einzelne Einfügung auszuführen.

    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
quelle
0

Hinzufügen zur Antwort von @ 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
quelle
Können Sie den Wert in Ihrer Antwort erklären, der nicht bereits in der von @ GDP akzeptierten Antwort enthalten ist? Dies ist fast eine reine Code-Antwort.
Mickmackusa
Es wird gezeigt, wie die $valuesVariable mit einem Array von comma separated row stringsprogrammgesteuert gefüllt wird, was viel Zeit spart und eine geringere Fehlerquote aufweist, anstatt die durch Kommas getrennten Zeichenfolgen wie in seiner Antwort manuell zu erstellen oder sogar zu verketten.
Mohd Abdul Mujib
Diese Informationen sollten in Ihre Antwort gepackt werden, damit zukünftige Forscher ausgebildet werden können.
Mickmackusa
So wie ich es sehe, ist der Code ziemlich selbsterklärend, obwohl es sicherlich Verbesserungsmöglichkeiten geben kann. Wenn Sie dies glauben, können Sie die Antwort jederzeit bearbeiten und verbessern
Mohd Abdul Mujib,
Ihr Code ist selbsterklärend für diejenigen, die verstehen, was die PHP / Joomla-Syntax bedeutet. Sie möchten Ihre eigene Arbeit nicht verfeinern? Unter JSX (mehr als Stackoverflow) ist es äußerst wichtig, die Antworten vollständig zu erklären, da die Leute, die gerade eine Karriere in der Webentwicklung beginnen, von CMS dazu verleitet werden. Sie wissen, dass der Sinn des Posten von Inhalten hier in der Aufklärung liegt, oder? Ich meine, ich ermutige Sie, Ihre beste Antwort zu veröffentlichen und das Risiko einzugehen, Upvotes zu verdienen.
Mickmackusa