Laravel 观察器 (observer) 在 updated 事件触发的时候更新自己的某个字段会不会造成无限循环?

在使用laravel Model 观察器时,Model自身一个字段需要在更新时自动维护。
使用以下方式

    /**
     * Handle the stock order item "updated" event.
     *
     * @param \App\Models\StockOrderItem $stockOrderItem
     * @return void
     */
    public function updated(StockOrderItem $stockOrderItem)
    {
        $stockOrderItem->balance = 998.88;
        $stockOrderItem->save();
    }

这样会不会导致一直执行这个更新?

在页面中测试了一下这种写法。会卡很久....

是不是观察器对应的状态下,不能对当前Model使用同样的操作状态?比如updated的时候不能再这个事件中对自身的Model更新

看了下日志.....确实进入了无限循环了...cpu也瞬间高起来了。

Laravel 观察器 (observer) 在 updated 事件触发的时候更新自己的某个字段会不会造成无限循环?

面向Google编程
drinke9
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

放到 updating 中,,,然后不要手动 save

4年前 评论
讨论数量: 9
drinke9
/**
 * Handle the stock order item "updated" event.
 *
 * @param \App\Models\StockOrderItem $stockOrderItem
 * @return void
 */
public function updated(StockOrderItem $stockOrderItem)
{
    //采购单状态更新之后自动维护balance字段
    if ($stockOrderItem->isDirty('status')) {
        $stockOrderItem->balance = 666.88;
        $stockOrderItem->save();
    }
}

这种写法也不行....估计只能通过控制器中对应更新操作Modal的时候手动更新了

4年前 评论
Shuyi

查一下呗,


if ($stockOrderItem->balance != 666.88) {
     $stockOrderItem->balance = 666.88;
     $stockOrderItem->save();
}
4年前 评论
阿神

观察器里面用DB操作试试

4年前 评论
ALMAS

为何不在第一次更新时一并更新,非要要在observer中更新?

4年前 评论

会的,前往别在ob里面更新,会死循环的

4年前 评论

在观察器中不要使用 $model->save()

4年前 评论
drinke9

@showcj 只要不使用自己的model save,就不会出现死循环的

4年前 评论
showcj 4年前

放到 updating 中,,,然后不要手动 save

4年前 评论

会死循环的

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!