【问题标题】:Laravel, beanstalkd and multiple databasesLaravel、beantalkd 和多个数据库
【发布时间】: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


    【解决方案1】:

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

    删除特征,它应该将对象作为一个整体序列化,因此您的工作不必访问数据库来获取其数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-17
      • 2021-08-30
      • 1970-01-01
      • 2021-11-17
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多