一个诡异的 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 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 4

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

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

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

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

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

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

file

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

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

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

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