在 Yii2 中保存新模型/活动记录后,我正在文件系统上安排作业。我在 afterSave 中执行此操作,我想使用我返回的调度程序的作业 ID 更新记录。
但是当我在将正确的属性设置为作业 ID 后在模型中调用 $this->update() 时,没有发生更新。在 afterSave() 中使用 update() 可能是个坏主意,但是解决这个问题的正确方法是什么?
在 Yii2 中保存新模型/活动记录后,我正在文件系统上安排作业。我在 afterSave 中执行此操作,我想使用我返回的调度程序的作业 ID 更新记录。
但是当我在将正确的属性设置为作业 ID 后在模型中调用 $this->update() 时,没有发生更新。在 afterSave() 中使用 update() 可能是个坏主意,但是解决这个问题的正确方法是什么?
您可以使用updateAttributes($attributes)
update()
当不需要数据验证并且只需要更新一小部分属性时,此方法是一种快捷方式。您可以将要更新的属性指定为名称列表或名称-值对。如果是后者,则相应的属性值会相应修改。然后该方法会将指定的属性保存到数据库中。
请注意,此方法不会执行数据验证,也不会 触发事件。
http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#updateAttributes()-detail
我在那里看到两个选项:
在模型中创建额外的内部字段,例如private $task_sended = false;
In afterUpdate set task_sended = true 并检查它
if (!$this->task_sended){ //发送任务到调度器 $this->task_sended = true; }
使用 DAO 命令更新模型
\Yii::$app->db->createCommand()->update(self::tableName(), $update, ['id'=>$this->id])->execute();