Nie sądzę Zend_Db wspiera wstawianie wielu wierszy.
Ale jeśli masz tylko dwa rzędy lub trochę więcej, możesz po prostu użyć pętli.
foreach ($data as $row)
{
$db->insert('table', $row)
}
Bill Karwin, były programista Zend Framework, napisał
this on Nabble some time ago:
Zestawy wierszy są w zasadzie obiektem kolekcja, więc chciałbym dodać do tej klasy metod w celu umożliwienia wiersze mają być dodane do zestawu. Więc powinieneś być w stanie to zrobić:
// creates a rowset collection with zero rows
$rowset = $table->createRowset();
// creates one row with unset values
$row = $table->createRow();
// adds one row to the rowset
$rowset->addRow($row);
// iterates over the set of rows, calling save() on each row
$rowset->save();
Nie ma sensu, aby przejść do createRowset liczbę całkowitą(), aby utworzyć N pustych wierszy. Trzeba by po prostu powtórzyć ich, by i tak zaludnili je wartościami. Więc możesz napisać pętlę, aby utworzyć i wypełnić pojedyncze wiersze danymi aplikacji, a następnie dodać je do kolekcji.
$rowset = $table->createRowset();
foreach ($appData as $tuple)
{
$row = $table->createRow($tuple);
$rowset->addRow($row);
}
$rowset->save();
To ma sens, aby umożliwić tablicą tablic mają być przekazane do createRowset(), ponieważ byłoby to zgodne z wykorzystaniem przechodząc krotki do createRow().
$rowset = $table->createRowset($appData); // pass array of tuples
To wykonanie w tej samej pętli, jak w poprzednim przykładzie (bez zapisywania(), na końcu), tworząc nowy zestaw wierszy nowych rzędach, gotowy do zaoszczędzić (d).
Istnieją dwa sposoby SQL, aby poprawić efektywność wprowadzania danych:
użyć pojedynczego INSERT z wielu rzędach
WKŁADKA DO t (COL1, Col2, Col3) wartości (1, 2, 3), (4, 5, 6), (7, 8, 9);
Przygotuj INSERT i wykonać go wielokrotnie:
PRZYGOTOWAĆ INSERT INTO t (col1, col2, Col3) wartości; (,??) EXECUTE 1, 2, 3 EXECUTE 4, 5, 6 EXECUTE 7, 8, 9
jednak pracować zarówno z tych udoskonaleń zwiększyłoby złożoność klas Row i zestaw wierszy. Wynika to z wewnętrznego sposobu, w jaki bieżąca klasa Zend_Db_Table_Row rozróżnia wiersz, który musi być INSERTed lub UPDATEd, gdy wywołasz save().To rozróżnienie jest enkapsulowane przez obiekt Row, więc zestaw wierszy nie wie, czy poszczególne wiersze są nowymi wierszami czy zmodyfikowanymi kopiami istniejących wierszy. Dlatego, aby klasa Rowset oferowała wielowątkową metodę save(), która używa bardziej wydajnego SQL, zarządzanie brudnymi danymi musiałoby być całkowicie refaktoryzowane. Łatwiejszym rozwiązaniem jest, aby zestaw wierszy mógł wykonywać iteracje po swoich wierszach, wywołując metodę save() na każdym z nich. Jest to lepsze w przypadku enkapsulacji OO, ale nie pomaga zoptymalizować kodu SQL w celu wstawienia zestawu zestawów wierszy.
W każdym razie rzadko się zdarza, aby załadować wiele wierszy danych w typowym żądaniu sieciowym, gdy istnieje największe zapotrzebowanie na wydajny SQL. Różnica w wydajności dla niewielkiej liczby wierszy jest niewielka, więc byłaby zauważalna poprawa tylko wtedy, gdy ładujesz masowo dużą liczbę wierszy. Jeśli tak jest, nie powinieneś używać INSERT mimo to, powinieneś używać MySQL's LOAD DATA statement lub równoważnej funkcji, jeśli używasz innej marki RDBMS. INSERT nie jest zazwyczaj najskuteczniejszym wyborem do ładowania dużej ilości danych.
Jeśli chodzi o zwrot kluczy wygenerowanych automatycznie, nie zawracałbym sobie głowy. Zauważ, że jeśli używasz zwykłego SQL (na przykład w mysql CLI) i wstawiasz wiele wierszy do jednej instrukcji INSERT, możesz uzyskać tylko ostatnią wygenerowaną wartość id, a nie wartości id dla wszystkich wstawianych wierszy. To jest zachowanie SQL; Dotyczy to dowolnego języka lub dowolnej struktury.
INSERT INTO t (col1, col2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
SELECT LAST_INSERT_ID(); -- returns only the id for the third tuple
Jeśli potrzebują identyfikatora dla każdego wiersza, należy napisać pętlę i włożyć rzędów po jednym na raz, pobieranie wygenerowany identyfikator po każdym wierszu wstawiony.
multi-wkładka funkcja żądania w Zend 2.0 ([ZF2-475] (http://framework.zend.com/issues/browse/ZF2-475)) został zamknięty jako wontfix. – Tgr