【发布时间】:2017-11-24 21:49:02
【问题描述】:
我有一个项目,其中每个客户都有一个唯一的子域和他们自己的数据库。
我想使用 Laravel 的队列来处理作业和发送通知。但由于 SerializesModels trait 只对模型 id 进行序列化/反序列化,因此该作业总是试图从主数据库中检索数据,无论哪个客户端启动该作业。
有没有办法可以指定数据库连接?如果这不可行,我愿意接受建议的替代工作流程。
来自 Laravel 文档:
在处理作业时,Eloquent 模型将被优雅地序列化和反序列化。如果您的队列作业在其构造函数中接受 Eloquent 模型,则只有模型的标识符将被序列化到队列中。当实际处理作业时,队列系统会自动从数据库中重新检索完整的模型实例。这对您的应用程序完全透明,并且可以防止序列化完整 Eloquent 模型实例可能出现的问题。
示例:因此从 OrderController 以正确的顺序调度作业
dispatch(new SendEventSignupEmail($order));
订单通过job类中的构造函数注入
public function __construct(Order $order)
{
//
$this->order = $order;
}
据我了解,模型 id 被提取并序列化并发送到处理方法,在那里它被反序列化并从数据库中重新检索模型。
public function handle()
{
Mail::to($this->order)->send(new EventSignup($this->order));
}
问题在于,此时 $this->order 实际上是一个不同的顺序(或作业失败),因为 serializesModels trait 从默认数据库中检索模型。
【问题讨论】:
标签: php laravel laravel-5.3 beanstalkd laravel-forge