我正在尝试使用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,
];
那么我该如何在事件中访问和仅发送更改的字段?
答案 0 :(得分:1)
这是由SerializesModels特性引起的。这将导致模型被序列化为其主键,然后在执行作业时从数据库中重新获取。
此功能在排队作业延迟的情况下很有用,例如,您将一封电子邮件排队发送给$ user。用户更改了他们的电子邮件地址,排队的作业运行,但是由于它从数据库中重新提取了用户,因此转到了新的电子邮件地址。
在您的情况下,您绝对不想将模型序列化为其键,因为您需要将属性存储在该特定模型实例中。