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
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

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

4年前 评论
讨论数量: 9
ALMAS

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

4年前 评论

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

4年前 评论
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年前 评论

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

4年前 评论

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

4年前 评论
drinke9

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

4年前 评论
showcj 4年前

会死循环的

4年前 评论

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