数据库访问对象batchInsert()yii2在插入每个记录后运行另一个函数

时间:2018-04-02 08:04:29

标签: yii2 yii2-model

我正在使用batchInsert() Yii2数据库访问对象的功能。我需要运行另一个函数,比如在插入每个记录后从PHP代码发送电子邮件。实现此目的的解决方法是什么?或者是否可以插入所有AUTO_INCREMENT个行? 代码是

Yii::$app->db->createCommand()->batchInsert(Address::tableName(), 
['form_id','address'], $rows)->execute();

我正在使用https://www.yiiframework.com/doc/api/2.0/yii-db-command#batchInsert()-detail

中记录的batchInsert()

1 个答案:

答案 0 :(得分:1)

首先,您没有使用ActiveRecord。有关ActiveRecord的更多信息,请参阅文档:APIguideYii::$app->db->createCommand()是一个DAO,它比ActiveRecord简单得多,并且不支持同样的事件。

其次,ActiveRecord没有batchInsert(),并且有充分的理由 - 当您批量插入时,很难检测插入记录的ID(至少在可靠的数据库中)独立的方式)。有关这方面的更多信息,请参阅GitHub

但是,如果您在插入之前知道记录的ID或某些唯一字段(例如用户除了数字ID,它还有唯一的登录名和/或电子邮件),您可以在手动插入和运行事件后获取它们:

$models = Address::findAll(['email' => $emailsArray]);
foreach ($models as $model) {
    $model->trigger('myEvent');
}

但是,除非你要插入数百万条记录,否则你应该坚持使用简单的foreach和$model->save(),以简化和可靠。

还有一个yii2-collection官方扩展名。这更像是草案和POC,但未来可能会很有趣。