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.

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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.