我在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-relationship起作用,但是当涉及多对多关系和数据透视表时它似乎不起作用。
我试过这个:
class Kindergarden extends Eloquent {
public function children()
{
return $this->hasManyThrough('Children', 'Group', 'kid', 'gid');
}
}
然后尝试拨打
Kindergarden::find(1)->children;
我确信有一个非常简单的方法可以做到这一点,但我对laravel完全不熟悉,而且在sql上并不是那么棒,所以我找不到任何东西可以帮助我解决这个问题。
修改 管理以找到使用Fluent执行此操作的方法:
$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();
仍然希望能够使用Eloquent来做到这一点。
答案 0 :(得分:4)
在你的幼儿园课程中:
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命名为(例如Kindergarden表中的组ID)group_id,而不是gid。使其更具可读性,并确切地知道它与之相关。与您的孩子ID相同,将其命名为'child_id'而不是'chiid'。
编辑:由于我不知道你的桌子结构,所以用上面的函数加点盐。我希望我的建议让你走上正确的道路!如果有帮助请告诉我