我正在使用“多租户”概念开发一个可以在多个数据库(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()
谢谢!