Php Yii2从afterSave触发模型/记录更新

Php Yii2从afterSave触发模型/记录更新,php,activerecord,yii2,Php,Activerecord,Yii2,在Yii2中保存了一个新模型/活动记录之后,我正在文件系统上安排一个作业。我在afterSave中这样做,我想用我得到的调度程序的作业id更新记录 但是,当我在为作业id设置了正确的属性之后在模型中调用$this->update()时,没有发生任何更新。在afterSave()中使用update()可能是个坏主意,但解决这个问题的正确方法是什么?我看到了两个选项: 在模型中创建额外的内部字段,类似于private$task\u sended=false在afterUpdate中设置task_se

在Yii2中保存了一个新模型/活动记录之后,我正在文件系统上安排一个作业。我在afterSave中这样做,我想用我得到的调度程序的作业id更新记录

但是,当我在为作业id设置了正确的属性之后在模型中调用$this->update()时,没有发生任何更新。在afterSave()中使用update()可能是个坏主意,但解决这个问题的正确方法是什么?

我看到了两个选项:

  • 在模型中创建额外的内部字段,类似于
    private$task\u sended=false在afterUpdate中设置task_sended=true并检查

    如果(!$this->task\u send){ //将任务发送到计划程序 $this->task_sended=true; }

  • 使用DAO命令更新模型

    \Yii::$app->db->createCommand()->update(self::tableName(),$update,['id'=>$this->id])->execute()


  • 您可以使用
    updateAttributes($attributes)

    当未进行数据验证时,此方法是
    update()
    的快捷方式 只需要更新一小部分属性

    您可以将要更新的属性指定为名称列表或 名称-值对。如果为后者,则为相应的属性值 将进行相应的修改。然后,该方法将保存指定的 属性导入数据库

    请注意,此方法将执行数据验证,并且将 触发事件


    这将是无限循环。在beforeSave()中执行此逻辑。这是有道理的,但我需要保存的记录的id传递给调度程序。所以BeforeSave()不是一个选项。你可以简单地覆盖
    更新
    ,或者使用/override
    保存
    @soju对不起,为Yii 2更新,我以为是Yii1@Alex谢谢,选项2很好用。但是,语法略有不同,能否将答案更新为\Yii::$app->db->createCommand()->update(self::tableName(),$update,['id'=>$this->id])->execute();$update是一个数组,其中包含要更新的列的key=>value对。