Как я добавляю больше чем одну строку с Zend_Db?

21
задан Thomaschaaf 3 May 2009 в 12:35
поделиться

3 ответа

Вы можете выполнить любой синтаксис SQL по вашему желанию, включая многострочные операторы INSERT, с помощью метода Zend_Db_Adapter_Abstract::query().

Но методы классов Zend_Db_Table и Zend_Db_Table_Rowset не поддерживают вставку нескольких строк за один раз.

19
ответ дан Bill Karwin 29 November 2019 в 03:36
поделиться

Это работа.

 $query = 'INSERT INTO ' . $db->quoteIdentifier('table') . ' (`col1`, `col2`) VALUES ';
    $queryVals = array();
    foreach ($data as $row) {
        foreach($row as &$col) {
            $col = $db->quote($col);
        }
        $queryVals[] = '(' . implode(',', $row) . ')';
    }
    $stmt = $db->query($query . implode(',', $queryVals));

Как построить несколько запросов вставки в Zend Framework

1
ответ дан Community 29 November 2019 в 03:36
поделиться

Я не думаю, что 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 () в конце), создавая новый набор строк из новых строк, готовых к be save () г.

В SQL есть два способа повысить эффективность вставки данных: ВЫПОЛНИТЬ 1, 2, 3 ВЫПОЛНИТЬ 4, 5, 6 EXECUTE 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; Это'

33
ответ дан 29 November 2019 в 03:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: