您好我有三张桌子
组织
id | name
1 | org1
2 | org2
网站
id | name | organisation_id
1 | site1 | 1
2 | site2 | 1
3 | site3 | 2
服务
id | name | site_id
1 | service1 | 1
2 | service2 | 1
3 | service2 | 2
在这里,我想获得组织的所有服务(比方说1)。 我可以得到像这样的所有组织网站,但我如何获得服务:
$sites = Site::whereHas('organisation', function ($query) {
$query->where('id', 1);
})->get();
模型
organisationModel
public function sites() {
return $this->hasMany('App\Site');
}
siteModel
public function organisation(){
return $this->belongsTo('App\Organisation');
}
public function services() {
return $this->hasMany('App\Service');
}
serviceModel
public function site(){
return $this->belongsTo('App\Site');
}
答案 0 :(得分:1)
您可以与'has many through'建立良好关系:
模特组织:
public function services()
{
return $this->hasManyThrough(Service::class, Site::class, 'organisation_id', 'site_id', 'id');
}
获取:
$services = Organisation::find(1)->services;
或者您可以使用nested whereHas 获取所有服务:
$services = Service::whereHas('site.organisation', function ($query) {
$query->where('organisation.id', 1);
})->get();
答案 1 :(得分:0)
你可以这样:
Site::with('organisation')
->select('id', 'name')
->with(['services' => function ($q) {
return $q->select('id', 'name');
}])
->where('organisation_id', 1)
->get();
答案 2 :(得分:0)
这可以在没有nested eager loading
的地方实现$organization=Organization::with('sites','sites.services')->where(['id'=>1])->first();
foreach($organization->sites as $site)
{
foreach($site->services as $service)
{
print_r($service->name);
}
}