2017-03-22 160 views
0

我需要一些关于如何解决这个问题的指导,请指点我正确的方向。四模式关系选择和聚合

我有四个型号设置:因为

1. Area (has many subareas) 
2. Subarea (has many buildings and has many persons through buildings) 
3. Building (has many persons) 
4. Person (contains a field named age) 

通过分区模型我能够检索该子区域内的每个建筑的平均年龄,“经历了许多”分区之间的关系负责人:

$mySubareaModel::with(‘avg_age_per_building’)->get() 

Subarea: 
Name: xxx 
Lat: yyy 
Long: zzz 
Building_avg_age: (a list of buildings and the avg age) 
     Building 1: 
      AvgAge: 30 
     Building 2: 
      AvgAge: 25 
     Building 3: 
      AvgAge: 21 

到目前为止好,但现在我想为区域级那里是对人没有直接的关系这样做。 在每个领域我想分区和他们的平均年龄的名单,象下面这样:

Area: 
Name: xxx 
Subareas: (a list of subareas and the avg age) 
     Subarea 1: 
      AvgAge: 23 
     Subarea 2: 
      AvgAge: 21 

什么是我选择这里?

  1. 我是否需要在区域模型(selectRaw,join,group)内完成一个完整的连接链才能获得我想要的?
  2. 我能以某种方式利用在分区级别上生成列表的已经工作的代码吗?

    $ myAreaModel ::与(“分区avg_age_per_building。”) - > some_kind_of_joins_and aggregation_here

如果是这样,怎么会在加入和聚集的样子?

  1. 其他选项?区域模型中的“是否有许多通过分区的建筑物”使事情变得更容易?

回答

1

看着你们的关系,嵌套相关的模型不行吗?

Have a look at nested eager loading

Area::with('subarea.building.person')->get(); 

更新:

在这样的集合可能进行操作可能是你在找什么。我还没有机会测试它,但它可能会引导你

$result = Area::with('subarea.building.person')->get(); 

    return $result->subarea->map(function($subareas, $key){ 
     return $subareas->building->map(function($buildings, $key){ 
      return $buildings->reduce(function($carry, $building){ 
       return $carry + $building->avg('age'); 
      })/ count($buildings) *100; 
     }); 
    }); 
+0

嗯,我认为它的工作原理。但我不知道如何去做其余的事,以达到我的目标。你的代码会让我访问所有列表但是我需要处理数据以产生我的帖子中的示例... group并将它聚合在区域和分区级别 – Josef

+0

我已更新我的答案。 – Yat23

+0

谢谢,我会试试看,当我回家 – Josef