2014-03-07 76 views
1

我在Laravel中进行雄辩的数据库查询时遇到了一些麻烦。我已经搜查了很多,但我不知道如何寻找答案。Laravel与多个模型关系层的雄辩查询

我正在拉拉维尔为幼儿园做一个网页,我需要让所有的孩子都与一个幼儿园连在一个集合/数组中。问题在于孩子们只能通过他们的小组与幼儿园联系。所以查询需要能够让所有属于幼儿园的任何小组的所有孩子都能够接触到幼儿园。

模型关系是这样的:
一个幼儿园有许多,并属于幼儿园一个
一个有许多孩子,并孩子有很多

我已经设法到目前为止做的最好的是这样的:

public function getChildren(){ 

    $kid = Session::get('kid'); 

    $k = Kindergarden::find($kid); 
    $groups = $k->group; 

    $children; 

    foreach($groups as $g){ 
     $children = $children->merge($g->children); 
    } 

    $children = $children->toArray(); 

    return Response::json($children); 
} 

但是,这使得重复当孩子在幼儿园同几组。这似乎也是一种不必要的复杂方式。

有一段时间我也尝试让hasManyThrough关系起作用,但是当存在一个多对多关系和一个数据透视表时,它似乎不起作用。

我试着用这样的:

class Kindergarden extends Eloquent { 
    public function children() 
    { 
     return $this->hasManyThrough('Children', 'Group', 'kid', 'gid'); 
    } 
} 

,然后试着打电话给

Kindergarden::find(1)->children; 

我敢肯定有一个非常简单的方法来做到这一点,但我完全陌生的laravel在sql中并不是那么棒,所以我一直无法找到任何帮助我弄清楚的东西。

编辑: 设法找到一种方法使用流利的做到这一点:

$children = DB::table('children') 
     ->join('children_group', 'children.chiid', '=', 'children_group.chiid') 
     ->join('group', 'group.gid', '=', 'children_group.gid') 
     ->where('group.kid', '=', $kid) 
     ->groupby('children.chiid') 
     ->get(); 

还是希望能够做到这一点使用口若悬河,虽然。

回答

3

在你的幼儿园等级:

public function groups() 
{ 
    $this->hasMany('Groups', 'group_id', 'id'); 
} 

在组类:

public function children() 
{ 
    $this->hasMany('Children', 'child_id', 'id') 
} 

然后尝试:

$children = Kindergarden::with(['groups', 'groups.children'])->get(); 

这种方式,你可以去通过各组幼儿园,和显示每个组的每个孩子。

也只是一个建议:在您的数据库表中,我会将您的相关ID(例如幼儿园表中的组ID)命名为group_id,而不是gid。使它更具可读性,并且您确切知道它与相关的内容。与您的孩子ID相同,将其命名为'child_id'而不是'chiid'。

编辑:由于我不知道你的表结构,采取上述功能与一粒盐。我希望我的建议能让你走上正确的道路!让我知道它是否有帮助

+0

如果有必要,我建议添加 - > where('id',$ my-> id)子句更直接搜索。但是这个答案看起来不错。 +1 –