【问题标题】:Laravel eloquent query with several layers of model relationships具有多层模型关系的 Laravel 雄辩查询
【发布时间】:2014-03-07 15:53:33
【问题描述】:

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

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    在你的幼儿园班上:

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

    在你的 Group 类中:

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

    那就试试吧:

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

    这样您可以浏览幼儿园的每个小组,并显示每个小组中的每个孩子。

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

    编辑:由于我不知道您的表结构,因此请对上述函数持保留态度。我希望我的建议能让你走上正确的道路!让我知道是否有帮助

    【讨论】:

    • 如有必要,我建议添加 ->where('id', $my->id) 子句以进行更直接的搜索。但是这个答案看起来很合适。 +1
    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 2016-11-26
    • 2021-06-17
    • 2016-07-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多