我有以下结构:
'建筑物'有很多'块?它有很多单位'有很多 '租户'
我需要获取住在建筑物内的所有租户的清单。
Laravel提供了hasMany和hasManyThrough命令,可帮助您获取具有直接关系或通过单个中间表相关的模型集合,但如果您想获得两个,三个或任何级别的相关元素,该怎么办?
使用Laravel / Eloquent实现这一目标的正确方法是什么?
答案 0 :(得分:1)
在这种情况下没有本机关系。
我创建了一个HasManyThrough
级的无限关系:Repository on GitHub
安装后,您可以像这样使用它:
class Building extends Model {
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
public function tenants() {
return $this->hasManyDeep(Tenant::class, [Block::class, Unit::class]);
}
}
答案 1 :(得分:0)
有几种计算方法。
答案 2 :(得分:0)
首先在各自的模型中定义关系(一对一/一对多) 然后可以使用帮助程序检索该关系数据 E.g;
$users = User::with('podcasts')->get();
// here podcasts is the defined relationship in user model
答案 3 :(得分:0)
要查找给定建筑物中的所有租户,最简单的方法是使用JOIN
子句。
我假设您的所有关系都hasMany
被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();
如果这是您不止一次使用的内容,那么我建议您在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();
答案 4 :(得分:0)
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