php - 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 被两个站点抢占,因为它与两个站点都有租约。但是,它不仅抓住了该网站的租约,还抓住了它的所有租约。
我如何仅获得该站点的租约?如果这令人困惑,我很抱歉,它很难解释。
解决方案
似乎你有一个site_id
在tenancies
桌子上,我猜它是指sites
桌子上的 id,所以你可以在你Site
的模型上添加一个关系Tenancy
(一个简单的 hasOne 或 hasMany,如果一个站点可以有多个租约)。
澄清一下,您使用的是hasManyThrough
站点和租约之间的关系,因此关系名称表示您通过租约拥有许多租户。因此,场地和租约之间存在直接关系。
推荐阅读
- delphi - 无法使用 TLS 连接到 Indy TIdHttpServer
- php - 致命错误:__autoload() 不再受支持,请使用 spl_autoload_register() PHP 8.0
- ansible - Ansible 使用 GitHub OAuth 令牌运行“composer install”
- python - 在 Docker 中为 Raspberry Pi 安装 opencv2(新操作系统映像 Bullseye)
- postgresql - 在 shell 脚本 psql 中引用的问题
- python - 使用表单和 Django 的用户登录身份验证
- javascript - 将 React 应用程序部署到 github 页面是空白的
- scala - 如何使用 Zeppelin 读写 delta 格式?(安装和导入 Delta Lake)
- javascript - 解构 mongoose 文档
- python - 无法保存 Python 的 Flask 会话中对象列表中的 MongoDB 集合数据