Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 拉威尔,建立深厚的关系_Laravel_Eloquent - Fatal编程技术网

Laravel 拉威尔,建立深厚的关系

Laravel 拉威尔,建立深厚的关系,laravel,eloquent,Laravel,Eloquent,我的结构如下: “建筑物”有许多“街区”,其中有许多“单元”,其中有许多 “租户” 我需要一份住在一栋楼里的所有房客的名单 Laravel提供了hasMany和hasManyThrough命令,可帮助您获取具有直接关系或通过单个中间表相关的模型集合,但如果您希望获取两个、三个或任何级别的相关元素,该怎么办 使用Laravel/Eloquent实现这一点的正确方法是什么?有几种方法可以计算它 首先,您可以定义建筑和块之间的多个关系 通过使用单元的街区和租户之间的多通关系,查找建筑物每个街区的租户

我的结构如下:

“建筑物”有许多“街区”,其中有许多“单元”,其中有许多 “租户”

我需要一份住在一栋楼里的所有房客的名单

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


使用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