Я не думаю, что Zend_Db поддерживает вставку нескольких строк.
Но если у вас всего две строки или чуть больше, вы можете просто использовать цикл.
foreach ($data as $row)
{
$db->insert('table', $row)
}
Билл Карвин , бывший разработчик Zend Framework, написал
об этом на Nabble некоторое время назад :
Наборы строк в основном являются объектами коллекции, поэтому я бы добавил в этот класс методы, позволяющие добавлять строки в набор. Так что вы должны быть в состоянии сделать это:
// 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();
Нет смысла передавать целое число в createRowset () для создания N пустых строк. Вам бы просто нужно было пройти через них, чтобы заполнить их значениями в любом случае. Таким образом, вы можете написать цикл для создания и заполнения отдельных строк данными приложения, а затем добавить их в коллекцию.
$rowset = $table->createRowset();
foreach ($appData as $tuple)
{
$row = $table->createRow($tuple);
$rowset->addRow($row);
}
$rowset->save();
Имеет смысл разрешить передачу массива массивов в createRowset (), поскольку это будет соответствовать использованию передачи кортежа для createRow ().
$rowset = $table->createRowset($appData); // pass array of tuples
Это будет выполнять тот же цикл, что и в предыдущем примере выше (за исключением save () в конце), создавая новый набор строк из новых строк, готовых для сохранения () d.
Существует два способа повышения эффективности вставки данных в SQL:
Использование одного оператора INSERT с несколькими строками:
INSERT INTO t (col1, col2, col3) ЗНАЧЕНИЯ (1, 2, 3), (4, 5, 6), (7, 8, 9);
Подготовьте оператор INSERT и выполните его несколько раз:
ПОДГОТОВИТЬ ВСТАВКУ В t (col1, col2, col3) ЗНАЧЕНИЯ (?,?,?);
ВЫПОЛНИТЬ 1, 2, 3
ВЫПОЛНИТЬ 4, 5, 6
ВЫПОЛНИТЬ 7, 8, 9
Однако поддержка любого из этих улучшений добавит сложности классам Row и Rowset. Это происходит из-за внутреннего способа, которым текущий класс Zend_Db_Table_Row различает строку, которую нужно ВСТАВИТЬ или ОБНОВИТЬ при вызове save (). Это различие инкапсулируется объектом Row, поэтому Rowset не знает, являются ли отдельные строки новыми строками или измененными копиями существующих строк. Поэтому, чтобы класс Rowset мог предложить многострочный метод save (), который использует более эффективный SQL, управление грязными данными должно быть полностью реорганизовано. Более простое решение - для Rowset перебирать свои строки, вызывая save () для каждой. Это лучше для инкапсуляции ОО, хотя и не помогает оптимизировать SQL для вставки набора строк.
В любом случае, очень редко массовая загрузка многих строк данных в типичном веб-запросе, когда существует наибольшая потребность в эффективном SQL. Разница в эффективности для небольшого числа строк невелика, поэтому это будет заметное улучшение, только если вы загружаете огромное количество строк. Если это так, вам не следует использовать INSERT в любом случае, вы должны использовать оператор MySQL LOAD DATA или эквивалентную функцию, если вы используете другую марку СУБД. INSERT обычно не самый эффективный способ загрузки большого количества данных.
Что касается возврата автоматически сгенерированных ключей, я бы не стал беспокоиться. Обратите внимание, что если вы используете простой SQL (например, в CLI mysql) и вставляете несколько строк в одну инструкцию INSERT, вы можете получить только последнее сгенерированное значение id, а не значения id для всех вставленных строк. Это поведение SQL; это верно для любого языка или любой основы.
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
Если вам нужен идентификатор для каждой строки, вы должны написать цикл и вставлять строки по одной, извлекая сгенерированный идентификатор после каждой вставленной строки.