Итак, можно ли вставить несколько строк в один запрос с помощью ActiveRecord, или лучше использовать DAO для этого?
Вы можете использовать batchInsert()
yii\db\Command
. Подробнее см. Здесь . При использовании с ActiveRecord
убедитесь, что все данные загружены перед вставкой.
Предполагая, что у вас есть массив $ моделей с классом Post
, это можно сделать следующим образом:
$rows = []; foreach ($models as $model) { if (!$model->validate()) { // At least one model has invalid data break; } $rows[] = $model->attributes; }
Если модели не требуют проверки, вы можете ArrayHelper
код выше, используя ArrayHelper
для построения массива $rows
.
use yii\helpers\ArrayHelper; $rows = ArrayHelper::getColumn($models, 'attributes');
Затем просто выполните пакетную вставку:
$postModel = new Post; Yii::$app->db->createCommand()->batchInsert(Post::tableName(), $postModel->attributes(), $rows)->execute();
PS $postModel
просто используемый для вытягивания списка имен attirubute, вы также можете извлечь это из любой существующей модели $ в вашем массиве $ models.
Если вам не нужно вставлять все атрибуты, вы можете указать его при заполнении массива $rows
:
$rows[] = [ 'title' => $model->title, 'content' => $model->content, ];
Не забудьте заменить $postModel->attributes
на ['title', 'content']
.
В случае большего количества атрибутов вы можете использовать некоторые функции массива для указания точных атрибутов для вставки.