Пакетная вставка ActiveRecord (yii2)

Можно ли вставить несколько строк в одном запросе с помощью Yii ActiveRecord? Или это возможно только через низкоуровневые объекты DAO?

33

Решение

Ты можешь использовать 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'],

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

48

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]