关于队列序列化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 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

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

1周前 评论
LiamHao (楼主) 1周前
讨论数量: 1

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

1周前 评论
LiamHao (楼主) 1周前

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