Laravel-在嵌套的位置仅检索父关系的行

时间:2018-10-26 11:31:04

标签: php laravel laravel-5 eloquent

我有3个带有Relations的模型。有这样的关系

Sites
Tenancies
Tenants

1 site can have many tenancies
1 tenancy can have 1 tenant

通过使用像这样的hasManyThrough关系,我得到了对该站点有租约的所有租户的集合

public function tenants(){
    return $this->hasManyThrough(
        'App\Models\Tenants\Tenants',
        'App\Models\Tenancies\Tenancies',
        'site_id', // Foreign key on Tenancies table...
        'id', // Foreign key on invoices table...
        'id', // Local key on tenants table...
        'linked_tenant_id' // Local key on tenancies table...
    )->distinct();
}

然后仅获得这样的活跃租约

public function activeTenancies(){
    return $this->hasMany('App\Models\Tenancies\Tenancies', 'linked_tenant_id', 'id')->where('active',1);
}

然后这样称呼

    $sites = Sites::whereHas('tenants')->with(['tenants' => function($query){
        $query->whereHas('activeTenancies')->with('activeTenancies');
    }]);

这很好用,如果我随后在集合中添加dd,则它仅返回具有有效租约的站点,然后随其返回租户。

我的问题是,每个租户可以在许多站点拥有许多租约。

因此,假设我有一个名为FakeComp的租户,并且可以说FakeComp与此站点1和站点2都有租约。

Site - 1
Tenancy - TenancyABC
Tenant - FakeComp

Site - 2
Tenancy - TenancyBCA
Tenant - FakeComp

当我循环我的站点和租户时,由于“ FakeComp”同时具有站点1和站点2的租约,因此会返回

Site - 1
  |
  |-----> Fake Comp
              |
              |---------> TenancyABC
              |---------> TenancyBCA

Site - 2
  |
  |-----> Fake Comp
              |
              |---------> TenancyABC
              |---------> TenancyBCA

不仅仅是像这样获得该网站的租约

Site - 1
  |
  |-----> Fake Comp
              |
              |---------> TenancyABC

Site - 2
  |
  |-----> Fake Comp
              |
              |---------> TenancyBCA

FakeComp被两个站点都捕获,因为它与两个站点都有租约。但是,它不仅抢了该站点的租约,还抢了它的所有租约。

我如何仅获得该站点的租约?很抱歉,这很令人困惑,很难解释。

1 个答案:

答案 0 :(得分:0)

似乎您在site_id表上有一个tenancies,我猜想它是指sites表上的ID,因此您可以在上面添加一个关系SiteTenancy的模型(如果站点可以有多个租约,则为简单的hasOne或hasMany)。

为澄清起见,您正在站点和租户之间使用hasManyThrough关系,因此关系名称是说您有许多租户的租户。因此,站点与租户之间有直接的联系