Laravel雄辩的查询与几层模型关系

时间:2014-03-07 15:53:34

标签: php laravel eloquent

我在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来做到这一点。

1 个答案:

答案 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'。

编辑:由于我不知道你的桌子结构,所以用上面的函数加点盐。我希望我的建议让你走上正确的道路!如果有帮助请告诉我