Laravel关系数据透视表的多个关系

问题描述 投票:0回答:1

您需要以某种方式获得这些模型之间的关系

1)自动服务模型

2)主模型

3)服务模型

这是我的数据透视表结构

id, auto_service_id, master_id, service_id

现在,我需要为每个AutoService获得其主人及其提供的服务。

一个主机可以属于许多自动服务,并且在每个自动服务中提供不同的服务。

[同一服务可以由同一自动服务中的多个主机提供。

如何建立这些模型之间的关系?

现在我如何实现这一点

数据透视表

id, auto_service_id, pivot_key, master_id, service_id

在主模型中

public $services = [];

使用中型号

public $masters = [];

在AutoService型号中

public function mastersServices(){
    return $this->belongsToMany(User::class, 'autoservice_map_automaster_map_service', 'auto_service_id', 'pivot_key')->withPivot("master_id","service_id");
}

public function masters(){
    return $this->belongsToMany(User::class, 'autoservice_map_automaster_map_service', 'auto_service_id', 'master_id')->withPivot("service_id");
}

public function services(){
    return $this->belongsToMany(User::class, 'autoservice_map_automaster_map_service', 'auto_service_id', 'service_id')->withPivot("master_id");
}


public function servicesWithMasters(){
    $services_arr = [];
    foreach ($this->masters as $master){
        foreach ($this->services as $service) {
            if (!array_key_exists($service->id,$services_arr)){
                $service->masters[] = $master;
                $services_arr[$service->id] = $service;
            }
            else{
                $services_arr[$service->id]->masters[] = $master;
            }
        }
    }
    return $services_arr;
}

public function mastersWithServices(){
    $masters_arr = [];
    foreach ($this->services as $service) {
        foreach ($this->masters as $master){
            if (!array_key_exists($master->id,$masters_arr)){
                $master->services[] = $service;
                $masters_arr[$master->id] = $master;
            }
            else{
                $masters_arr[$master->id]->services[] = $service;
            }
        }
    }
    return $masters_arr;
}

最初,这解决了我的问题。但是我正在寻找一种优雅的方法,或者能够对servicesWithMasters和mastersWithServices进行查询

laravel model relation
1个回答
0
投票

您应该有一个数据透视表autoservice_service

在您的服务模型中

public function autoServices(){
  $this->belongsToMany('App\AutoService');
}

在您的主模型中

public function autoServices(){
  $this->hasMany('App\AutoService');
}

在您的AutoService模型中]

public function services(){
  $this->belongsToMany('App\Service');
}
public function masters(){
  $this->belongsTo('App\Master');
}

在数据透视表中,然后使用service_idmaster_idautoservice_id。如果要使用时间戳记,请使用方法withTimestamps()(例如$this->belongsToMany('App\Master')->withTimestamps();

编辑:如果要在主服务器和服务之间建立关系,其中一个主服务器可以具有多个服务,反之亦然,则应制作另一个数据透视表master_service。在Service模型中:

public function masters(){
   return $this->belongsToMany('App\Master');
}

并且在Master模型中:

public function services(){
   return $this->belongsToMany('App\Service');
}

现在您可以检查主人的工作,示例

1) Services of master
App\Master::find($id)->services();
2) Which masters do service
App\Service::find($id)->masters();

另一个解决方法是,您可以在数据透视表中添加另一个外键,然后使用->withPivot('column1', 'column2')

© www.soinside.com 2019 - 2024. All rights reserved.