我有一个项目,其中每个客户端都有一个唯一的子域和他们自己的数据库。
我想使用Laravel的队列处理作业和发送通知。但由于SerializesModels trait只序列化/反序列化模型id,因此无论哪个客户端启动作业,作业总是尝试从主db中检索数据。
有没有办法可以指定数据库连接?如果这不可行,我愿意建议其他工作流程。
来自Laravel文档:
在处理作业时,Eloquent模型将被优雅地序列化和反序列化。如果排队作业在其构造函数中接受Eloquent模型,则只有模型的标识符将序列化到队列中。实际处理作业时,队列系统将自动从数据库中重新检索完整的模型实例。它对您的应用程序完全透明,可以防止序列化完整的Eloquent模型实例时出现的问题。
示例:因此,使用OrderController
中的正确顺序调度作业dispatch(new SendEventSignupEmail($order));
订单是通过作业类
中的构造函数注入的 public function __construct(Order $order)
{
//
$this->order = $order;
}
我的理解是模型id被提取并序列化并发送到handle方法,在那里它被反序列化并且从db重新检索模型。
public function handle()
{
Mail::to($this->order)->send(new EventSignup($this->order));
}
问题是,此时,$ this->订单实际上是一个不同的订单(或者作业失败),因为serializesModels trait从默认的db中检索了模型。
答案 0 :(得分:0)
SerializesModels特性(在我看来)有点不直观。如您所见,它只序列化ID,然后命中数据库以重新水化对象。但是,为了序列化模型,不需要该特征。
删除特征,它应该整个对象序列化,因此你的工作不必点击数据库来获取它的数据。