Laravel,深入了解关联关系

3
我有以下结构:
'buildings' 有许多 'blocks',每个块都有许多 'units',每个单元都有许多 'tenants'
我需要获取住在大楼中的所有租户的列表。
Laravel 提供了 hasMany 和 hasManyThrough 命令,帮助您获取具有直接关系或通过单个中间表相关的模型集合,但是如果您想要获取两个、三个或任意级别深度的相关元素,应该如何使用 Laravel/Eloquent 实现呢?

1
使用 whereHas - DevK
或者只需使用一系列的 JOIN。但是你尝试过什么? - fubar
2
尝试在随意联系之前阅读Laravel文档,以免没有任何尝试的迹象。 - jeremykenedy
@devk,whereHas 只会向下获取两层,例如在这个示例中将获取建筑的单元。我认为没有一种方法可以链接 whereHas 语句。 - paishin
1
您可以嵌套 whereHas 语句。 - DevK
显示剩余5条评论
5个回答

16

这种情况下没有本地的关联关系。

我创建了一个可以无限级联的HasManyThrough关联关系:GitHub上的存储库

安装后,您可以像这样使用:

class Building extends Model {
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function tenants() {
        return $this->hasManyDeep(Tenant::class, [Block::class, Unit::class]);
    }
}

1
嘿,乔纳斯,非常感谢你,这似乎正是我在寻找的。最终我在租户表中加入了一个建筑外键,这正是我想要避免的。我会尝试你的解决方案并回复你。 - paishin

7

1
我能看到的最合适的答案。 - myestery

4
为了找到给定建筑物中的所有租户,最简单的方法是使用“JOIN”子句。
我假设您的所有关系都是由“belongsTo”反转的“hasMany”。
$tenants = Tenant::select('tenants.*')
    ->join('units', 'units.id', '=', 'tenant.unit_id')
    ->join('blocks', 'blocks.id', '=', 'units.block_id')
    ->join('buildings', 'buildings.id', '=', 'blocks.building_id')
    ->where('buildings.id', 123)
    ->get();

如果您会多次使用此功能,则建议在您的Tenant模型上创建一个查询范围。
class Tenant extends Eloquent
{
    // ...

    public function scopeInBuilding($query, $buildingId)
    {
        return $query->select('tenants.*')
            ->join('units', 'units.id', '=', 'tenant.unit_id')
            ->join('blocks', 'blocks.id', '=', 'units.block_id')
            ->join('buildings', 'buildings.id', '=', 'blocks.building_id')
            ->where('buildings.id', $buildingId);
    }

    // ...
}

你可以按照以下方式使用它:

$tenants = Tenant::inBuilding(123)->get();

0

有几种计算方法。

  1. 首先,您可以在建筑物和街区之间定义一个has many关系。
  2. 使用街区和单位之间的has many Through关系找到每个建筑物的租户。

这有点类似于我目前正在做的事情,但随着关系变得更深,它会变得非常混乱。 - paishin

0

首先在各自的模型中定义关系(一对一/一对多),然后可以使用with助手检索该关系数据。例如:

$users = User::with('podcasts')->get();
// here podcasts is the defined relationship in user model

嘿HCK,感谢回复,但这只能让我深入一层,我需要访问那些表之间没有直接关系的数据。 - paishin
@paishin 哈哈,我刚刚编辑了问题。答案来自kshitij。希望你已经解决了。 - Kenny Horna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接