Laravel Eloquent加入三个表 - 有多个通过

时间:2016-10-03 05:31:15

标签: eloquent laravel-5.2

您好我有三张桌子

组织

 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');
}

3 个答案:

答案 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);
    }
}
相关问题