求助 observer 的 updated 内再次 save 导致死循环

1. 系统环境

CentOS + PHP8.2 + MySQL8.0

2.代码框架

wenman框架使用的 illuminate/database 11.33

3.问题

observerupdated方法内在此掉用save方法会导致死循环,如下代码:

class Device
{
    public function updated($device) {
        if ($device->isDirty('balance') && $device->balance < 0) {
            $device->state = -1;
            $device->save()
        }
    }
}

执行save后再次触发的updated$device->isDirty('balance')依然为真,这种情况是否有解决方案?
我当前的解决方案是在查一下这条数据在save

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

在if中复制一份然后同步一下,这样既不干扰其他changed事件触发,也能保证当前括号内业务继续触发changed事件

if($device->isDirty('balance') && $device->balance < 0){
    $newModel = $device->fresh();
    $newModel->state = -1;
    $newModel->save();
}
2个月前 评论
RainLee1990 (楼主) 2个月前
还不出来 (作者) 2个月前
讨论数量: 9

静默保存模型 $device->saveQuietly();

快速入门《Laravel 10 中文文档》

2个月前 评论
RainLee1990 (楼主) 2个月前
王小大 (作者) 2个月前

使用saveing,在更新前处理,或者强制忽略观察者

2个月前 评论

updated 通常作为后续日志这种记录的

如果要这样用,换成DB直接改

2个月前 评论
//伪代码

if($device->isDirty('balance')  &&  $device->balance  <  0){ 
    Device::query()->where('id', $device->id)->update(['status'=>-1]);
}
2个月前 评论

在if中复制一份然后同步一下,这样既不干扰其他changed事件触发,也能保证当前括号内业务继续触发changed事件

if($device->isDirty('balance') && $device->balance < 0){
    $newModel = $device->fresh();
    $newModel->state = -1;
    $newModel->save();
}
2个月前 评论
RainLee1990 (楼主) 2个月前
还不出来 (作者) 2个月前

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