Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ActiveRecord批量插入(yii2)_Php_Yii2_Dao_Batch Insert - Fatal编程技术网

Php ActiveRecord批量插入(yii2)

Php ActiveRecord批量插入(yii2),php,yii2,dao,batch-insert,Php,Yii2,Dao,Batch Insert,是否可以使用Yii的ActiveRecord在一个查询中插入多行?或者这只能通过较低级别的DAO对象实现 我有两种型号 1-交易 2-交易项目 事务项中有多行(单击添加行) 我想在数据库中存储多行transactionitems 您可以使用yii\db\Command的batchInsert()方法。见详情。 与ActiveRecord一起使用时,请确保在插入之前验证所有数据 假设您有一个带有类Post的$models数组,可以这样做: $rows = []; foreach ($models

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

我有两种型号 1-交易 2-交易项目

事务项中有多行(单击添加行)

我想在数据库中存储多行transactionitems


您可以使用
yii\db\Command
batchInsert()
方法。见详情。 与
ActiveRecord
一起使用时,请确保在插入之前验证所有数据

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

$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
仅用于提取attirubute名称列表,您还可以从$models数组中的任何现有$model提取该列表

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

$rows[] = [
    'title' => $model->title,
    'content' => $model->content,
];
不要忘记将
$postModel->attributes
替换为
['title','content']


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

因此,答案是否?我应该使用DAO。我认为目前ActiveRecord不支持这种开箱即用的方式。您可以做进一步的研究,但我找不到。$postModel->attributes应该是$postModel->attributes()@Dodo谢谢您的评论,更正了答案。@arogachev:如何在批插入中获得所有最新的插入id?