一个诡异的 Model::save 方法不存在的问题

前提是这样的,队列的某个consumer中的关于一个模型的save,有时候提是方法不存在

伪代码如下:

function handle()
{
    $id = $this->id;
    $model = Model::query()->find($id);
    if (!$model) throw new Exception('not found');
    Queue::push(new OtherJob($model->serial_id));
    $model['attr_1'] = 'processed';
    try {
        $model->save();
    } catch (Throwable $e) {
        $this->log(vsprintf("save_fail message:[%s], serialize:[%s], type:[%s]", [
            $e->getMessage(),
            serialize($order),
            gettype($order),
        ]), 'error');
    }
}

偶发性的能看到日志里有如下内容:

save_fail message:[Call to a member function save() on array], o:[a:1:{s:13:”last_queue_at”;O:25:”Illuminate\Support\Carbon”:3:{s:4:”date”;s:26:”2020-04-08 16:12:58.738117”;s:13:”timezone_type”;i:3;s:8:”timezone”;s:3:”PRC”;}}], type:[array]

但是看数据库中的attr_1确实也变成了processed

有碰到过类似问题的吗?

打赏
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 4

我们都是这样子调用 $model->attr_1 = 'processed'; $model->save();,还真没用过你的这种写法。

6年前 评论
cevin (楼主) 6年前
kiti 6年前
cevin (楼主) 6年前
kiti 6年前
cevin (楼主) 6年前

你这错误信息不够全,堆栈都没了,,,

6年前 评论
cevin (楼主) 6年前

mysql 有没有读写分离? 是不是读写分离的问题?

6年前 评论
cevin (楼主) 6年前
JerryBool (作者) 6年前

file

file
id=217 这个数据在我的库里没有 也就是说 你 find 出来的数据是空的 所以会有这个错误

建议你把数据的信息也放到日志里,你也说了这个错误是偶发的,这样方便你去查具体是哪条数据出的错

6年前 评论
cevin (楼主) 6年前
kiti (作者) 6年前
largezhou 6年前

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