Как выполнить задание только в основной базе данных в мультитенантном проекте? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть проект, в котором, когда мой пользователь регистрируется, мой проект по умолчанию подключается к моей основной базе данных по схеме publi c.

И когда пользователь успешно выполняет регистрацию, я делаю событие для отправьте электронное письмо, вот мой слушатель события:

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('contato@44online.com.br', '44 Online')
                ->to($data['email'], $data['name'])
                ->subject('Bem vindo a 44 Online!');
        });
    }
}

Он работает нормально, когда я использую ту же схему, что и publi c, но если я сделаю запрос, который должен изменить схему для клиента, и пользователь создает 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 

Что происходит?

1 Ответ

0 голосов
/ 08 мая 2020

Поскольку задания могут / должны выполняться в другом процессе, при изменении драйвера по умолчанию теряется (что в любом случае не кажется мне хорошей идеей)

Но в любом случае, если вы хотите, чтобы ваша работа использовала другую базу данных. в дескрипторе нужно передать ему конструктор задания .. например new Job ('tenant') / App :: make (MyJob :: class, ['connectionName' => 'tenant']);

Таким образом, имя соединения должно быть доступно в handle (), и вы можете изменить соединение после ввода функции handle ().

Вначале потребуется основное соединение, так как ваши работники очереди вероятно, все равно работает через это соединение.

...