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

Ste*_*pan 5 php laravel eloquent

我正在尝试使用更新事件将所有模型更改推送到前端。我不想发送整个模型,所以我找到了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();
    }
}
Run Code Online (Sandbox Code Playgroud)

模型:

    protected $dispatchesEvents = [
        'updated' => \App\Events\IcUpdated::class,
    ];
Run Code Online (Sandbox Code Playgroud)

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

Dev*_*von 4

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

这对于排队作业出现延迟的情况很有用,例如,您将电子邮件排队发送给 $user。用户更改了他们的电子邮件地址,排队的作业运行,但会发送到新的电子邮件地址,因为它从数据库中重新获取用户。

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