мая
23
Yii. Insert multiple rows.
Мои шедевры, Программирование
Метки (теги) : activerecord, extension, yii
Метода добавления одним запросом несколько записей в Yii нет, и правльно, на это есть весомые причины. Этот подход зависит от выбранной суБД, и отлично с этим справится, но я таки решил расширить ActiveRecord и добавить свой метод multiInsert(array $data), аргумент которого двумерный массив с данным для insert’ов, может это кому-то покажется изящней. Для этого я перегрузил классы CActiveRecord и CDbCommandBuilder. Примеры как юзать под кат.
В config.php
'import'=>array( ... 'application.extensions.multiInsert.*', ), |
В контроллере
public function actionIndex() { $tasks = new Tasks(); $tasks->setMultiAttributes(array( array( 'name' => 'test', 'description' => 'test description', ), array( 'name' => 'test2', 'description' => 'test2 description', ), array( 'name' => 'test3', 'description' => 'test3 description', ), )); $tasks->save(); } |
Класс Tasks должен наследоваться от DiverseCActiveRecord.
Пример с использованием CDbExpression
... $tasks->setMultiAttributes(array( array( 'name' => 'test', 'description' => 'test description', 'date' => new CDbExpression("NOW()"), ), |
Запрос будет примерно следующим
INSERT INTO `keys` (`id_tasks`, `key_type`, `key`) VALUES (:yp00, :yp01, :yp02), (:yp13, :yp14, :yp15), (:yp26, :yp27, :yp28)
Спасибо.
А если я передам такой массив по ошибке array(“name” => “test”, “description” => “test test test”), то что произойдет?? Выкинет исключение или что ???
Да, выкинет исключение.
Похоже на ошибку в коде – во первых модуль не работает (просто не вставляет записи), во воторых обнаружил в функции insert($attributes=null, $isMulti=false) параметр $isMulti нигде в функции не используется. Если бы все работало, был бы хороший полезный модуль
Пробежался по коду, да, Вы правы $isMulti не используется. Видно я в 20-ти строчках кода потерял ее и заменил проверкой if (empty($this->_multiAttributes)).
Это было написано одним махом, но, увы мне это решение уже напрочь не нравится. Я бы тут применил поведения в yii.
Да и на момент написания расширение работало. Гипотетически сломалось после апдейта yii.
Возможно действительно не работает из-за обновления. Я использую сейчас последнюю версию yii. Не могли бы поделиться ссылкой с конкретным примером (Вы писали что для мультивставки можно использовать поведения)? Очень уж нужно сделать мультивставку в Mysql, а овнокод писать не хочеться.
Заранее благодарю за ответ
Я в ближайшее время перепишу это расширение.