【问题标题】:Deeply nested relationships filtering深层嵌套关系过滤
【发布时间】:2015-10-16 04:06:51
【问题描述】:

最近我遇到了访问和过滤深层嵌套关系的问题,所以我决定寻求帮助。

所以,我有这个数据库结构: http://s21.postimg.org/motrjy3dj/Screenshot_from_2015_07_24_12_14_51.png

我需要让一个项目中的所有团队,然后为每个团队分配(该团队的)用户。

到目前为止一切顺利,当我尝试为每个用户获取报价时,我的问题就开始了。用户只能为分配的团队提供一个报价,这给我带来了问题。

这是我的代码:

$project = Project::with("variants")
                ->with(array(
                        "teams" => function($query) {

                            $query->with(array(

                                "users" => function($query) {

                                    $query->with("offers");
                                }
                            ));

                        }
                    ))
                ->find($projectID);

我在“用户”模型中有一个 hasManyThrough 关系“offers”,它返回给我用户的所有优惠,但实际上我只需要(一个)相关 team_user 表的优惠。

我尝试使用范围过滤报价,但这是一个糟糕的解决方案,因为对于每个用户,我都有额外的 db 查询..

有没有办法动态过滤这些优惠?

谢谢!

【问题讨论】:

    标签: php laravel laravel-4 eloquent relationships


    【解决方案1】:

    我强烈建议对这种复杂的查询使用连接:

    $projectOffers = Project
         ->join('team', 'team.project_id', '=', 'project.id')
         ->join('team_user', 'team_user.team_id', '=', 'team.id')
         ->join('user', 'user.id', '=', 'team_user.user_id')
         ->join('offer', 'offer.id', '=', 'team_user.offer_id')
         ->get([
             'project.id',
             'team.id AS team_id',
             'user.id AS user_id',
             'offer.id AS offer_id',
             // any other columns you want
         ]);
    

    【讨论】:

    • 嗯,这绝对可以,但我有点希望将所有查询保留在 Eloquent ORM 下,因为据我所知,它可以与 Fluent 不同类型的数据库一起使用。
    • 实际上 John 在 Eloquent 和简单的 DB::table() 查询构建器之间的数据库支持没有区别。它们都在下面使用相同的引擎,并且都具有相同的查询。但我已根据要求更新了我的答案以使用 Eloquent。
    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 2020-11-22
    • 2017-03-02
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多