Подтвердить что ты не робот

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

Итак, возможно ли вставить несколько строк в один запрос с помощью ActiveRecord или лучше использовать DAO для этого?

4b9b3361

Ответ 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'].

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