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

Моя текущая настройка такова, что User и Notification сохраняются в моей основной базе данных, Post сохраняется в другой базе данных. Соединения User и Notification дБ:

protected $connection = "main";

и Post Соединения дБ:

protected $connection = "second";

Моя таблица уведомлений сохраняется в основной базе данных. У меня есть класс уведомлений с именем «PostReplied», который принимает $post в качестве параметра. поэтому он сериализуется, когда он в очереди. Когда он начал обрабатывать это задание, он пытается получить сообщение из «основной» базы данных вместо «второй» базы данных Post connection.

Есть предложения о том, как заставить уведомления работать с моделями кросс-баз данных?

1 Ответ

1 голос
/ 30 марта 2020

Решение 1

В зависимости от того, какую мультитенантную настройку вы используете, она может зависеть от установки имени соединения на модели. Например, вы можете установить соединение для модели Post следующим образом:

Models / Post. php

/**
 * Get the current connection name for the model.
 *
 * @return string|null
 */
public function getConnectionName()
{
    return 'tenant_connection';
}

Затем вам нужно определить tenant_connection введите database.connections config (config/database.php). Я знаю, hyn/multitenant делает это следующим образом (https://packagist.org/packages/hyn/multi-tenant).

Решение 2

Еще один, меньший способ сделать это - включить соединение на - go во время создания запросов, например так:

DB::setDefaultConnection('custom_connection');
Post::query()->where('status', 1)->get();

// Revert to default connection, assuming `mysql` here.
DB::setDefaultConnection('mysql');

Это дает вам больше свободы, но ваш код запутывается, и я не рекомендую его.

Решение 3

Это также может усложнить понимание вашего кода. Вы можете включить имя базы данных в свои запросы, например, так:

DB::table('database1.posts as d1p')
    ->leftjoin('database2.users as d2u', 'd1p.user_id', '=', 'd2u.id');        

Возможно, вы можете смешивать и сопоставлять это с помощью функций Eloquent Builder.

...