Laravel 拉威尔,建立深厚的关系
我的结构如下: “建筑物”有许多“街区”,其中有许多“单元”,其中有许多 “租户” 我需要一份住在一栋楼里的所有房客的名单 Laravel提供了hasMany和hasManyThrough命令,可帮助您获取具有直接关系或通过单个中间表相关的模型集合,但如果您希望获取两个、三个或任何级别的相关元素,该怎么办Laravel 拉威尔,建立深厚的关系,laravel,eloquent,Laravel,Eloquent,我的结构如下: “建筑物”有许多“街区”,其中有许多“单元”,其中有许多 “租户” 我需要一份住在一栋楼里的所有房客的名单 Laravel提供了hasMany和hasManyThrough命令,可帮助您获取具有直接关系或通过单个中间表相关的模型集合,但如果您希望获取两个、三个或任何级别的相关元素,该怎么办 使用Laravel/Eloquent实现这一点的正确方法是什么?有几种方法可以计算它 首先,您可以定义建筑和块之间的多个关系 通过使用单元的街区和租户之间的多通关系,查找建筑物每个街区的租户
使用Laravel/Eloquent实现这一点的正确方法是什么?有几种方法可以计算它
首先在各自的模型中定义关系(一对一/一对多) 然后可以使用with helper检索该关系数据 例如:
$users=User::with('podcast')->get();
//这里podcast是用户模型中定义的关系
要查找给定建筑中的所有租户,最简单的方法是使用JOIN
子句
我假设你所有的关系都是有很多
与belongsTo
相反
$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();
如果您将不止一次地使用这一功能,那么我建议您在租户
模型上创建一个查询范围
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();
本例中没有本机关系 我创建了一个具有无限级别的
HasManyThrough
关系:
安装后,您可以这样使用它:
类构建扩展了模型{
使用\Staudenmeir\elokenthasmanydeep\hassrelationships;
公共功能租户(){
返回$this->hasManyDeep(租户::类、[Block::类、Unit::类]);
}
}
使用或仅使用一系列的连接。但是你尝试过什么?在没有任何尝试迹象的情况下随机伸出手来之前,先阅读一下Laravel文档。@devk,whereHas只会让你达到两层深度,在本例中,它会得到一栋建筑的单位。我不认为有什么方法可以链接whereHas语句。@fubar,我所尝试的是丑陋的,我不希望回复基于此。我想知道什么是实现这一目标的合适的Larvel/雄辩的方式Hey HCK,谢谢你的回答,但这只会让我更深一层,我需要访问表之间没有直接关系的数据。@paishin lol我刚刚编辑了这个问题。答案来自kshitij。希望你能解决这个问题。这就是我目前正在做的事情,但随着关系的加深,它变得非常难看。亨利·乔纳斯,非常感谢你,这似乎正是我想要的。我最后在租户表中放入了一个用于构建的外键,这正是我试图避免的。我会尝试一下你的解决方案,然后再给你回复。
I think what you want to do is Nested eager loading.Like accessing relation with in relation:
E.g.
If you have posts which have comments and comments have replies and
you want all posts with comments and replies of the comments :
$posts = Post::with('comment.reply')->get();
Link:https://laravel.com/docs/5.3/eloquent-relationships#eager-loading