您需要以某种方式获得这些模型之间的关系
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进行查询
您应该有一个数据透视表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_id
,master_id
,autoservice_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')
。