一个诡异的 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

有碰到过类似问题的吗?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

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

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

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

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

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

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

file

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

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

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

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