Laravel Eloquent:跨多个数据库架构的多少对多关系

时间:2019-01-08 13:56:18

标签: mysql laravel eloquent table-relationships

我正在使用“多租户”概念开发一个可以在多个数据库(MariaDB)上运行的系统,但是我没有为此使用任何框架。

一个用于主系统层的模式,一个用于每个客户端/租户的排他方案。

我需要将两个表(多对多)相关联,一个正在运行其层的租户中的一个表(区域)与另一个租户(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)可以返回另一个架构的表(区域)的结果,还有一个模型(Area)可以返回其自身方案的表(区域)的结果。

我尝试了几种替代方法,最接近的是在Area模型中使用了所属的TotoToy方法,但是返回的结果与预期不符。

    public function mainarea()
{
    return $this->belongsToMany(Area::class, "pt_area_mainarea", "mainarea_id", 'area_id');
}

Area::with('mainarea')->get()

谢谢!

0 个答案:

没有答案