Laravel雄辩的$ model-> getChanges()在更新事件中始终为空

时间:2019-04-03 12:40:01

标签: php laravel eloquent

我正在尝试使用update事件将所有模型更改推到前端。我不想发送整个模型,所以我找到了hasChanges()方法。但是它总是空的。

我首先想到的是,此事件在实际保存之前触发,但是getDirty()也为空。然后,我认为在调试栏中,由于某种原因,它会在更新模型后立即再次检索模型(从数据库中选择)。这是正常行为,还是只是创建一个新的模型对象,而不是将现有对象传递给事件?

事件:

class IcUpdated implements ShouldBroadcastNow
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    private $ic;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($ic)
    {

        $this->ic = $ic;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return [
            new Channel('dashboard_' . ConfigHelper::getSelectedOrganizationId())
        ];
    }

    public function broadcastAs()
    {
        return 'ic.updated';
    }

    public function broadcastWith()
    {
        return $this->ic->getChanges();
    }
}

型号:

    protected $dispatchesEvents = [
        'updated' => \App\Events\IcUpdated::class,
    ];

那么我该如何在事件中访问和仅发送更改的字段?

1 个答案:

答案 0 :(得分:1)

这是由SerializesModels特性引起的。这将导致模型被序列化为其主键,然后在执行作业时从数据库中重新获取。

此功能在排队作业延迟的情况下很有用,例如,您将一封电子邮件排队发送给$ user。用户更改了他们的电子邮件地址,排队的作业运行,但是由于它从数据库中重新提取了用户,因此转到了新的电子邮件地址。

在您的情况下,您绝对不想将模型序列化为其键,因为您需要将属性存储在该特定模型实例中。