【问题标题】:Yii2 triggering a model/record update from afterSaveYii2 从 afterSave 触发模型/记录更新
【发布时间】:2014-04-28 22:18:03
【问题描述】:

在 Yii2 中保存新模型/活动记录后,我正在文件系统上安排作业。我在 afterSave 中执行此操作,我想使用我返回的调度程序的作业 ID 更新记录。

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

【问题讨论】:

  • 这将是无限循环。在 beforeSave() 中执行此逻辑。
  • 有道理,但我需要将保存记录的 id 传递给调度程序。所以 BeforeSave() 不是一个选项。
  • 你可以简单地覆盖update,或者使用/覆盖save

标签: php activerecord yii2


【解决方案1】:

你可以使用updateAttributes($attributes)

这个方法是update()的快捷方式,当没有数据验证时 需要并且只需要更新一小部分属性。

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

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

http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#updateAttributes()-detail

【讨论】:

    【解决方案2】:

    我在那里看到 2 个选项:

    1. 在模型中创建额外的内部字段,例如 private $task_sended = false; 在 afterUpdate 设置 task_sended = true 并检查它

      如果 (!$this->task_sended){ //发送任务到调度器 $this->task_sended = true; }

    2. 使用DAO命令更新模型

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

    【讨论】:

    • @soju 对不起,更新到 Yii 2,我以为是 Yii 1
    • @Alex 谢谢,选项 2 工作正常。但是,语法略有不同,您能否将答案更新为 \Yii::$app->db->createCommand()->update(self::tableName(), $update, ['id'=>$this ->id])->执行(); $update 是一个数组,其中包含要更新的列的键=>值对。
    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 2020-07-08
    • 2021-06-30
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多