首页 > 解决方案 > Laravel - 仅检索嵌套 whereHas 中父关系的行

问题描述

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

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 被两个站点抢占,因为它与两个站点都有租约。但是,它不仅抓住了该网站的租约,还抓住了它的所有租约。

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

标签: phplaravellaravel-5eloquent

解决方案


似乎你有一个site_idtenancies桌子上,我猜它是指sites桌子上的 id,所以你可以在你Site的模型上添加一个关系Tenancy(一个简单的 hasOne 或 hasMany,如果一个站点可以有多个租约)。

澄清一下,您使用的是hasManyThrough站点和租约之间的关系,因此关系名称表示您通过租约拥有许多租户。因此,场地和租约之间存在直接关系。


推荐阅读