求助 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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

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

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

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

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

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

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

3个月前 评论

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

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

3个月前 评论
//伪代码

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

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

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

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