ActiveRecord批量插入(yii2)

37

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

我有两个模型: 1- 交易(Transaction) 2- 交易项目(TransactionItems)

交易项目中有多行数据(单击添加行)。

我想将多行交易项目存储到数据库中。

交易项目表的截图

1个回答

61
您可以使用yii\db\CommandbatchInsert()方法。详情请参见这里。 在与ActiveRecord一起使用时,请确保在插入之前验证所有数据。
假设您有一个$models数组,其中包含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 只是用于拉取属性名称列表,您也可以从 $models 数组中的任何现有 $model 中拉取这个列表。

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

$rows[] = [
    'title' => $model->title,
    'content' => $model->content,
];

请不要忘记将 $postModel->attributes 替换为 ['title', 'content']

如果有大量的属性,您可以使用一些数组函数来指定要插入的确切属性。


那么,答案是否定的?我应该使用DAO。 - user1561346
我认为目前的ActiveRecord不支持这个功能。你可以进一步研究,但我找不到它。 - arogachev
3
$postModel->attributes应该改为 $postModel->attributes()。 - Dodo
@Dodo 感谢您的评论,已经更正了答案。 - arogachev
2
@arogachev:如何在批量插入中获取所有最后插入的ID? - Santosh
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接