是否可以使用 Yii 的 ActiveRecord 在一个查询中插入多行?或者这只能通过较低级别的 DAO 对象实现?
我有两个模型 1- Transaction 2-TransactionItems
交易项目中有多行(单击添加行)。
我想在数据库中存储多行事务项。
是否可以使用 Yii 的 ActiveRecord 在一个查询中插入多行?或者这只能通过较低级别的 DAO 对象实现?
我有两个模型 1- Transaction 2-TransactionItems
交易项目中有多行(单击添加行)。
我想在数据库中存储多行事务项。
您可以batchInsert()
使用yii\db\Command
. 在此处查看详细信息。使用它时,ActiveRecord
请确保在插入之前验证所有数据。
假设你有一个带有 class 的 $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();
PS$postModel
仅用于拉取属性名称列表,您也可以从 $models 数组中的任何现有 $model 中拉取它。
如果您不需要插入所有属性,您可以在填充$rows
数组时指定它:
$rows[] = [
'title' => $model->title,
'content' => $model->content,
];
不要忘记替换$postModel->attributes
为['title', 'content']
。
如果属性数量较多,您可以使用一些数组函数来指定要插入的确切属性。