Laravel,得到深厚的关系

时间:2018-04-13 02:47:54

标签: laravel eloquent

我有以下结构:

  

'建筑物'有很多'块?它有很多单位'有很多   '租户'

我需要获取住在建筑物内的所有租户的清单。

Laravel提供了hasMany和hasManyThrough命令,可帮助您获取具有直接关系或通过单个中间表相关的模型集合,但如果您想获得两个,三个或任何级别的相关元素,该怎么办?

使用Laravel / Eloquent实现这一目标的正确方法是什么?

5 个答案:

答案 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)

有几种计算方法。

  1. 首先,您可以定义建筑物之间有很多关系。块。
  2. 使用块之间的多个关系来查找建筑物的每个块的租户。租户使用单位。

答案 2 :(得分:0)

首先在各自的模型中定义关系(一对一/一对多) 然后可以使用帮助程序检索该关系数据 E.g;

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

答案 3 :(得分:0)

要查找给定建筑物中的所有租户,最简单的方法是使用JOIN子句。

我假设您的所有关系都hasManybelongsTo反转。

$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