如何在多个租户项目中仅在主数据库中执行作业?

问题描述 投票:0回答:1

我有一个项目,当我的用户进行注册时,我的项目默认情况下连接到我的主数据库公共模式。

并且当用户成功注册后,我会创建一个事件来发送电子邮件,这是事件的侦听器:

class WelcomeNewCompanyListener implements ShouldQueue
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle($event)
    {

        $data = array (
            'name' =>  $event->company['name'],
            'email' =>  $event->company['email'],
        );

        $beautymail = app()->make(\Snowfire\Beautymail\Beautymail::class);
        $beautymail->send('emails.welcome', $data, function($message) use ($data)
        {
            $message
                ->from('[email protected]', '44 Online')
                ->to($data['email'], $data['name'])
                ->subject('Bem vindo a 44 Online!');
        });
    }
}

[当我使用与公众相同的模式时,它可以很好地工作,但是如果我提出一个需要更改租户模式的请求,并且用户根据每个示例进行了ResetPasswordEvent,则此操作很好。

我的项目在这里更改了中间件的连接:

 public function reconnect($companyInfo) {    

      DB::purge('tenant');
      Config::set('database.connections.tenant.schema', $companyInfo[0]->db_schema);
      DB::reconnect('tenant'); 
      Schema::connection('tenant')->getConnection()->reconnect();

   }

问题是,当用户使ResetPasswordEvent我的项目完成工作,但他正在从租户上进行数据库操作时,不是针对主表,我试图在句柄后放置重新连接但不起作用,它坚持要求从租户将作业插入数据库。我该怎么办?

当我在手柄上建立此连接时

      DB::purge('tenant');
      Config::set('database.connections.tenant.schema', 'public');
      DB::reconnect('tenant'); 
      Schema::connection('tenant')->getConnection()->reconnect();

我得到这份失败的工作,并且不使用任何连接

PDOException: SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "qu_users" does not exist
LINE 1: select * from "qu_users" where "qu_users"."users_id" is null...
                      ^ in 

发生了什么?

laravel queue jobs
1个回答
0
投票
但是无论如何,如果您希望您的工作使用其他数据库。在手柄您需要将其传递给作业的构造方法。例如new Job('tenant')/ App :: make(MyJob :: class,['connectionName'=>'tenant']);

这样,连接名称应该在handle()中可用,并且您可以在输入handle()函数之后更改连接。

在开始时,它将需要主要连接,因为您的队列工作者可能无论如何都在该连接上运行。

© www.soinside.com 2019 - 2024. All rights reserved.