Wie füge ich mehr als eine Zeile mit Zend_Db hinzu?
Ich habe ein array mit Informationen, die sieht mehr oder weniger wie diese:
$data[] = array('content'=>'asd');
$data[] = array('content'=>'asdf');
Und möchte ich hinzufügen, dass beide Einträge in der Datenbank.
$db->insert('table', $data);
nicht fügen Sie beide Einträge. Was mache ich falsch? Muss ich Zend_ Db_Table?
$data = array('content'=>'asdf');
$db->insert('table', $data);
funktioniert natürlich
InformationsquelleAutor der Frage Thomaschaaf | 2009-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass Zend_Db unterstützt das einfügen von mehreren Zeilen an.
Aber wenn Sie nur zwei Zeilen oder ein wenig mehr kann man einfach eine Schleife verwenden.
Bill Karwinein ehemaliger Zend Framework-Entwickler, schrieb diese auf Nabble vor einiger Zeit:
Rowsets sind im Grunde ein collection-Objekt, so würde ich hinzufügen, Methoden, Klassen, damit Zeilen Hinzugefügt werden gesetzt. So sollten Sie in der Lage sein, dies zu tun:
Macht es keinen Sinn, um eine ganze Zahl zu createRowset() erstellen N leere Zeilen. Sie würde nur noch zu Durchlaufen, Sie zu füllen Sie mit Werten sowieso. So könnten Sie auch schreiben, eine Schleife zu erstellen, und füllen Sie die einzelnen Zeilen mit Daten der Anwendung, und fügen Sie dann zu der Sammlung.
Macht es Sinn, ein array von arrays zu übergeben createRowset(), denn dies würde im Einklang mit der Verwendung der übergabe eines Tupels zu createRow().
Würde dies führen die gleiche Schleife wie im vorherigen Beispiel oben (mit Ausnahme der save() am Ende), die Schaffung einer neuen rowset von neuen Zeilen, bereit zu sein, speichern (), d.
Gibt es zwei Möglichkeiten, die in SQL zu verbessern, die Effizienz beim einfügen der Daten:
Verwendung einer einzelnen INSERT-Anweisung mit mehreren Zeilen:
INSERT INTO t (col1, col2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
Bereiten Sie eine INSERT-Anweisung, und führen Sie es mehrmals:
VORBEREITEN INSERT INTO t (col1, col2, col3) VALUES (?, ?, ?);
AUSFÜHREN, 1, 2, 3
AUSZUFÜHREN, 4, 5, 6
AUSZUFÜHREN, 7, 8, 9
Jedoch Unterstützung entweder von diesen Verbesserungen würde die Komplexität der Zeilen und Rowset Klassen. Dies ist aufgrund der inneren Weise den aktuellen Zend_Db_Table_Row Klasse unterscheidet zwischen einer Zeile muss Eingefügt oder Aktualisiert werden beim aufrufen von save(). Diese Unterscheidung ist gekapselt durch das Zeilen-Objekt, also das Rowset nicht weiß, ob die einzelnen Zeilen werden neue Zeilen oder modifizierte Kopien von bereits vorhandenen Zeilen. Daher wird für die Rowset-Klasse bieten eine multi-Zeile speichern () - Methode verwendet, effizientere SQL, der Verwaltung von schmutzigen Daten werden müsste völlig umgestaltet werden. Die einfachere Lösung ist für Rowset iterieren über seine Zeilen, den Aufruf von save() auf jeden. Das ist besser für die OO-Kapselung, obwohl es nicht helfen bei der Optimierung SQL zum einfügen von rowset.
In jedem Fall, es ist wirklich selten, bulk-load-viele Zeilen von Daten in einer typischen web-Anfrage, wenn es den größten Bedarf für eine effiziente SQL. Der Unterschied in der Effizienz für eine kleine Anzahl von Zeilen kleiner ist, so würde es eine spürbare Verbesserung nur, wenn Sie bulk-laden eine große Anzahl von Zeilen. Wenn das der Fall ist, sollten Sie sich nicht mit EINFÜGEN, wie auch immer, Sie sollten mit MySQL LOAD DATA-Anweisung, oder eine entsprechende Funktion, wenn Sie ein anderes RDBMS Marke. EINFÜGEN ist in der Regel nicht die effizienteste Wahl für das laden von vielen Daten.
Bezüglich der Rückkehr auto-generated-keys, ich würde nicht stören. Beachten Sie, dass wenn Sie mit plain-SQL (in mysql-CLI zum Beispiel), und fügen Sie mehrere Zeilen in einer einzelnen INSERT-Anweisung können Sie nur die zuletzt generierte id-Wert, nicht die id-Werte für alle Zeilen eingefügt. Das ist SQL-Verhalten, es ist wahr für jede Sprache oder jeden Rahmen.
Wenn Sie wollen, brauchen Sie die id für jede Zeile, schreiben Sie eine Schleife und legen Sie die Zeilen ein zu einer Zeit, abrufen der generierten id nach jeder Zeile eingefügt.
InformationsquelleAutor der Antwort markus
Können Sie beliebige SQL-syntax, die Sie wollen-einschließlich multi-row
INSERT
Aussagen-über dieZend_Db_Adapter_Abstract::query()
Methode.Sondern die Methoden der
Zend_Db_Table
undZend_Db_Table_Rowset
Klassen haben keine Unterstützung für das einfügen von mehreren Zeilen in einem Rutsch.InformationsquelleAutor der Antwort Bill Karwin
mehrere Zeilen einfügen, die Sie verwenden können, Zend_Db
(von Bill Karwin)
in Ihrem Fall können wir ändern, um diesen code:
generieren, diese '(?), (?)' dynamisch, sofern die Daten dynamisch ist, können Sie versuchen, mit diesem snippet:
hoffe, das hilft
Grüße,
Riki Risnandar
InformationsquelleAutor der Antwort risnandar
hier ist meine Lösung:
InformationsquelleAutor der Antwort ovnia
Wenn Sie verwenden ZF2 dann die Lösung könnte wie folgt Aussehen:
InformationsquelleAutor der Antwort Sergei Khaletskiy
Ist es Arbeit.
wie erstellen Sie mehrere insert-Abfrage in zend framework
InformationsquelleAutor der Antwort Knase