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