Nemyslím si, že Zend_Db podporuje vkládání více řádků.
Ale pokud máte jen dvě řady nebo trochu více, můžete použít smyčku.
foreach ($data as $row)
{
$db->insert('table', $row)
}
Bill Karwin , bývalý vývojář Zend Framework, napsal toto na Nabble před nějakou dobou :
Sady řádků jsou v podstatě objektem kolekce, takže bych do této třídy přidal metody, které umožní přidání řádků do sady. Takže byste měli být schopni udělat toto:
// 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();
Nemá smysl předávat celé číslo do createRowset() k vytvoření N prázdných řádků. Stejně byste je museli iterovat, abyste je naplnili hodnotami. Můžete tedy také napsat smyčku pro vytvoření a naplnění jednotlivých řádků daty aplikace a poté je přidat do kolekce.
$rowset = $table->createRowset();
foreach ($appData as $tuple)
{
$row = $table->createRow($tuple);
$rowset->addRow($row);
}
$rowset->save();
Má smysl povolit předávání pole polí createRowset(), protože by to bylo konzistentní s používáním předávání n-tice do createRow().
$rowset = $table->createRowset($appData); // pass array of tuples
To by provedlo stejnou smyčku jako předchozí příklad výše (s výjimkou save() na konci), čímž by se vytvořila nová sada řádků nových řádků připravená k save()d.
V SQL existují dva způsoby, jak zlepšit efektivitu vkládání dat:
-
Použijte jeden příkaz INSERT s více řádky:
INSERT INTO t (sloupec1, sloupec2, sloupec3) HODNOTY (1, 2, 3), (4, 5, 6), (7, 8, 9);
-
Připravte příkaz INSERT a proveďte jej několikrát:
PŘIPRAVTE INSERT INTO t (col1, col2, col3) VALUES (?, ?, ?);EXECUTE 1, 2, 3EXECUTE 4, 5, 6EXECUTE 7, 8, 9
Podpora některého z těchto vylepšení by však zvýšila složitost tříd Row a Rowset. To je způsobeno interním způsobem, jakým současná třída Zend_Db_Table_Row rozlišuje mezi řádkem, který je třeba INSERTOVAT nebo AKTUALIZOVAT, když zavoláte save(). Tento rozdíl je zapouzdřen objektem Row, takže sada řádků neví, zda jednotlivé řádky jsou nové řádky nebo upravené kopie existujících řádků. Proto, aby třída Rowset nabízela víceřádkovou metodu save() využívající efektivnější SQL, musela by být správa nečistých dat zcela přepracována. Jednodušším řešením je pro sadu řádků iterovat své řádky a na každém z nich zavolat save(). To je lepší pro zapouzdření OO, i když to nepomůže optimalizovat SQL pro vkládání sady řádků.
V každém případě je opravdu vzácné hromadně načítat mnoho řádků dat v typickém webovém požadavku, když je největší potřeba efektivního SQL. Rozdíl v účinnosti pro malý počet řádků je malý, takže by to bylo znatelné zlepšení pouze v případě, že hromadně nakládáte obrovské množství řádků. Pokud je to tak, neměli byste stejně používat INSERT, měli byste používat příkaz LOAD DATA MySQL nebo ekvivalentní funkci, pokud používáte jinou značku RDBMS. INSERT není obvykle nejúčinnější volbou pro načítání velkého množství dat.
Pokud jde o vracení automaticky generovaných klíčů, neobtěžoval bych se. Všimněte si, že pokud používáte prostý SQL (například v mysql CLI) a vložíte více řádků do jednoho příkazu INSERT, můžete získat pouze poslední vygenerovanou hodnotu id, nikoli hodnoty id pro všechny vložené řádky. Toto je chování SQL; platí to pro jakýkoli jazyk nebo jakýkoli rámec.
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
Pokud potřebujete ID pro každý řádek, měli byste napsat smyčku a vkládat řádky jeden po druhém, přičemž po každém vloženém řádku získáte vygenerované ID.