Laravel,beanstalkd和多个数据库

时间:2017-06-21 20:10:43

标签: php laravel laravel-5.3 beanstalkd laravel-forge

我有一个项目,其中每个客户端都有一个唯一的子域和他们自己的数据库。

我想使用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中检索了模型。

1 个答案:

答案 0 :(得分:0)

SerializesModels特性(在我看来)有点不直观。如您所见,它只序列化ID,然后命中数据库以重新水化对象。但是,为了序列化模型,不需要该特征。

删除特征,它应该整个对象序列化,因此你的工作不必点击数据库来获取它的数据。