Laravel Eloquent: отношение «многие ко многим» в схеме с несколькими базами данных - PullRequest
0 голосов
/ 08 января 2019

Я занимаюсь разработкой системы, работающей с несколькими базами данных (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()

Спасибо !!!

...