Я занимаюсь разработкой системы, работающей с несколькими базами данных (MariaDB), используя концепцию Multi-Tenancy, но я не использую для этого никаких фреймворков.
Одна схема для основного системного уровня и одна эксклюзивная схема для каждого клиента / арендатора.
Мне нужно связать две таблицы (многие со многими), одну таблицу (область) в арендаторе, который управляет своим уровнем, с другой таблицей (областью), которая находится в другом арендаторе (main_tenant).
Для каждого арендатора, который запускает свой системный уровень, у него уже есть сводная таблица (pt_area_masterarea), поскольку у каждого арендатора есть своя собственная схема.
Эта сводная таблица создается во время миграции и ссылается на таблицу областей текущей схемы с таблицей областей другой схемы.
Schema::create('pt_area_masterarea', function (Blueprint $table) {
// database schema name (ex: cliente-8c9a6e81-8bbb-4fec-8828-f623623031fb)
$database = App\Models\Company::findOrFail(1)->uuid;
$table->increments('id');
$table->integer('area_id')->unsigned();
$table->foreign('area_id')->references('id')->on('areas')->onDelete('cascade');
$table->integer('masterarea_id')->unsigned();
$table->foreign('masterarea_id')->references('id')->on("{$database}.areas")->onDelete('cascade');
});
Если я запускаю необработанный запрос, я получаю ожидаемый результат:
SELECT
`cliente-8c9a6e81-8bbb-4fec-8828-f623623031fb`.`areas`.*,
`pt_area_masterarea`.`area_id` AS `pivot_area_id`,
`pt_area_masterarea`.`masterarea_id` AS `masterarea_id`
FROM `cliente-8c9a6e81-8bbb-4fec-8828-f623623031fb`.`areas`
INNER JOIN `pt_area_masterarea`
ON `areas`.`id` = `masterarea_id`
id name ativo sistema pivot_area_id masterarea_id
10 FISCAL S N 1 10
10 FISCAL S N 2 10
10 FISCAL S N 3 10
11 SEGUROS S N 4 11
11 SEGUROS S N 5 11
11 SEGUROS S N 6 11
Пример сводной таблицы (pt_area_masterarea):
id area_id masterarea_id
1 1 10
2 2 10
3 3 10
5 4 11
6 5 11
7 6 11
Цель: я хотел бы добиться того же результата, используя Eloquent.
У меня есть модель (MainArea), которая может возвращать результат таблицы (области) другой схемы, а также модель (Площадь), которая может возвращать результат таблицы (области) своей собственной схемы.
Я пробовал несколько альтернатив, наиболее близким было использование метода assignToMany в модели Area, но результат не такой, как ожидалось.
public function mainarea()
{
return $this->belongsToMany(Area::class, "pt_area_mainarea", "mainarea_id", 'area_id');
}
Area::with('mainarea')->get()
Спасибо !!!