在Yii的ActiveRecord中,是否可以使用一次查询插入多行数据?或者这只能通过较低级别的DAO对象实现?
我有两个模型: 1- 交易(Transaction) 2- 交易项目(TransactionItems)
交易项目中有多行数据(单击添加行)。
我想将多行交易项目存储到数据库中。
在Yii的ActiveRecord中,是否可以使用一次查询插入多行数据?或者这只能通过较低级别的DAO对象实现?
我有两个模型: 1- 交易(Transaction) 2- 交易项目(TransactionItems)
交易项目中有多行数据(单击添加行)。
我想将多行交易项目存储到数据库中。
yii\db\Command
的batchInsert()
方法。详情请参见这里。
在与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
只是用于拉取属性名称列表,您也可以从 $models 数组中的任何现有 $model 中拉取这个列表。
如果您不需要插入所有属性,可以在填充 $rows
数组时指定:
$rows[] = [
'title' => $model->title,
'content' => $model->content,
];
请不要忘记将 $postModel->attributes
替换为 ['title', 'content']
。
如果有大量的属性,您可以使用一些数组函数来指定要插入的确切属性。