关于队列序列化Model后,original字段变为新值的问题

我在监听模型的updatingupdated事件,并在事件中投递了一个队列任务,是异步的。在监听器中打印模型,original字段与attributes不一致,并且changes字段存有变更的键值,这是正常的。但是,在异步执行时,打印模型,结果original字段与attributes字段一致,changes字段也空了。这是哪里的问题?

BaseModel监听器

<?php

namespace App\Observers;

use App\Models\BaseModel;
use App\Jobs\MyJob;

class BaseModelObserver
{
    public function updated(BaseModel $baseModel)
    {
        // 这里打印模型,结果中模型属性 attributes 和 original 两个字段会有不同的值
        // 并且 changes 字段会存有 attributes 和 original 中不一致的键值
        // dd($baseModel)
        MyJob::dispatch($baseModel);
    }
}

MyJob队列任务

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Models\BaseModel;

class ManagerActionDetailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $model;

    public function __construct(BaseModel $model)
    {
        $this->model = $model;
    }

    public function handle()
    {
        // 任务中打印模型,结果中模型属性 attributes 和 original 两个字段完全相同,且都是更新后的值
        //  changes 字段也为空了
        dd($this->model);
    }
}

问题:

  • 为什么队列中打印结果和监听器中不一致?

  • 如果我需要队列中保持originalchanges字段,怎么解决?

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

这是因为SerializesModels,它会把对应的job中的QueueableCollectionQueueableEntity类型的对象序列化时进行简化,以压缩job的payload,而Model类也实现了QueueableEntity这个接口,至于怎么解决,恐怕只有自己写个中间类中转一下了,或者把所需要的字段拿出来也塞进job里做额外的处理。

3年前 评论
LiamHao (楼主) 3年前
讨论数量: 2

这是因为SerializesModels,它会把对应的job中的QueueableCollectionQueueableEntity类型的对象序列化时进行简化,以压缩job的payload,而Model类也实现了QueueableEntity这个接口,至于怎么解决,恐怕只有自己写个中间类中转一下了,或者把所需要的字段拿出来也塞进job里做额外的处理。

3年前 评论
LiamHao (楼主) 3年前

file
我这里怎么可以?

2年前 评论

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