Вставка в ActiveRecord (yii2)

Итак, можно ли вставить несколько строк в один запрос с помощью 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'] .

В случае большего количества атрибутов вы можете использовать некоторые функции массива для указания точных атрибутов для вставки.