ActiveRecord批量插入(yii2)

use*_*346 35 php activerecord dao yii2

是否可以使用Yii的ActiveRecord在一个查询中插入多行?或者这只能通过较低级别的DAO对象实现?

aro*_*hev 53

你可以使用batchInsert()方法yii\db\Command.详情请见此处.使用时请ActiveRecord确保在插入之前验证所有数据.

假设您有类的$ models数组Post,可以这样做:

$rows = [];
foreach ($models as $model) {
    if (!$model->validate()) {
        // At least one model has invalid data

        break;
    }

    $rows[] = $model->attributes;
}
Run Code Online (Sandbox Code Playgroud)

如果模型不需要验证,您可以使用ArrayHelper构建$rows数组来缩短上面的代码.

use yii\helpers\ArrayHelper;

$rows = ArrayHelper::getColumn($models, 'attributes');
Run Code Online (Sandbox Code Playgroud)

然后只需执行批量插入:

$postModel = new Post;

Yii::$app->db->createCommand()->batchInsert(Post::tableName(), $postModel->attributes(), $rows)->execute();
Run Code Online (Sandbox Code Playgroud)

PS $postModel刚刚用于提取attirubute名称列表,您也可以从$ models数组中的任何现有$模型中提取它.

如果您不需要插入所有属性,则可以在填充$rows数组时指定它:

$rows[] = [
    'title' => $model->title,
    'content' => $model->content,
];
Run Code Online (Sandbox Code Playgroud)

不要忘了更换$postModel->attributes['title', 'content'].

如果属性数量较多,您可以使用一些数组函数来指定插入的确切属性.

  • $ postModel->属性应该是$ postModel-> attributes() (3认同)
  • @arogachev:如何在批量插入中获取所有光栅插入ID? (2认同)