Laravel ORM与约束嵌套关系

时间:2015-03-01 10:52:08

标签: laravel-4 nested relationships

我想知道如何在Laravel 4.1中使用约束执行嵌套关系查询。

这是一个有效的参考查询:

$users = User::with("careers.specialty.faculty.university")->get();

如您所见,有几个嵌套模型(具有各种关系类型)。

我想将一个可选约束加载到一个或多个模型,例如教师名称......

实现这一目标的最佳(也是最简单)方法是什么?

这是我到目前为止所尝试的内容,但似乎没有考虑约束(所有用户都被退回)。

    $users = User::with([
        'careers'=> function($query)use($levelInput){
                if ($levelInput ==""){
                    $query->get();
                }else{
                    $query->where('level','=',$levelInput)->get();
                }
            },
        'careers.specialty'=> function($query)use($specialtyInput){
                if ($specialtyInput ==""){
                    $query->get();
                }else{
                    $query->where('name','like','%'.$specialtyInput.'%')->get();
                }
            },
        'careers.specialty.faculty'=> function($query)use($facultyInput){
                if ($facultyInput ==""){
                    $query->get();
                }else{
                    $query->where('name','like','%'.$facultyInput.'%')->get();
                }
            },
        'careers.specialty.faculty.university'=> function($query)use($universityInput){
                if ($universityInput ==""){
                    $query->get();
                }else{
                    $query->where('name','like','%'.$universityInput.'%')->get();
                }
            }
        ])->get();

编辑:这是一个解决方案,感谢Maksym Cierzniak接受的答案:

$users = User::whereHas('promos',function($q)use($levelInput,$specialtyInput,$facultyInput,$universityInput){
        $q->where('level','like','%'.$levelInput.'%')->whereHas('specialty',function($q)use($specialtyInput,$facultyInput,$universityInput){
            $q->where('name','like','%'.$specialtyInput.'%')->whereHas('faculty',function($q)use($facultyInput,$universityInput){
                $q->where('name','like','%'.$facultyInput.'%')->whereHas('universities',function($q)use($universityInput){
                    $q->where('name','like','%'.$universityInput.'%');
                });
            });
        });
    })->get();

嗯,这段代码看起来很难看。但是它有效,如果你有更好的选择,请随意分享:)

1 个答案:

答案 0 :(得分:1)

with以这种方式工作,因此关系会急切地加载到您正在寻找的基本模型中。在这种情况下,您将始终获得所有User条记录,然后Laravel将尝试获取所有这些记录的关系。如果您想加载关系有某种约束的所有用户,您应该尝试使用whereHas方法。这种方式,例如你打电话

$posts = Blog::whereHas('comments', function($query){
   $query->where('content', 'like', 'foo%');
})->get();

通过这种方式,您只能获得与Blog有一些评论的content,例如foo。我希望这就是你要找的东西。