Итак, возможно ли вставить несколько строк в один запрос с помощью ActiveRecord или лучше использовать DAO для этого?
Вставка в ActiveRecord (yii2)
Ответ 1
Вы можете использовать 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
для построения массива $rows
.
use yii\helpers\ArrayHelper;
$rows = ArrayHelper::getColumn($models, 'attributes');
Затем просто выполните пакетную вставку:
$postModel = new Post;
Yii::$app->db->createCommand()->batchInsert(Post::tableName(), $postModel->attributes(), $rows)->execute();
P.S. $postModel
, просто используемый для вытягивания списка имен attirubute, вы также можете вытащить это из любой существующей модели $в вашем массиве $models.
Если вам не нужно вставлять все атрибуты, вы можете указать его при заполнении массива $rows
:
$rows[] = [
'title' => $model->title,
'content' => $model->content,
];
Не забудьте заменить $postModel->attributes
на ['title', 'content']
.
В случае большего количества атрибутов вы можете использовать некоторые функции массива для указания точных атрибутов для вставки.