Laravel 带约束的 ORM 嵌套关系
Laravel ORM nested relationships with constraints
我想知道如何在 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();
嗯,这段代码看起来真的很难看。但它有效,如果您有更好的选择,请随时分享它:)
with
以这种方式工作,因此关系会被急切地加载到您正在寻找的基础模型中。在这种情况下,您将始终获得所有 User
记录,然后 Laravel 将尝试获取所有这些记录的关系。如果你想加载所有关系有某种约束的用户,你应该尝试 whereHas
方法。这样,如果您调用
$posts = Blog::whereHas('comments', function($query){
$query->where('content', 'like', 'foo%');
})->get();
这样你只会得到 Blog
其中有一些评论 content
像 foo。希望这就是您要找的。
我想知道如何在 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();
嗯,这段代码看起来真的很难看。但它有效,如果您有更好的选择,请随时分享它:)
with
以这种方式工作,因此关系会被急切地加载到您正在寻找的基础模型中。在这种情况下,您将始终获得所有 User
记录,然后 Laravel 将尝试获取所有这些记录的关系。如果你想加载所有关系有某种约束的用户,你应该尝试 whereHas
方法。这样,如果您调用
$posts = Blog::whereHas('comments', function($query){
$query->where('content', 'like', 'foo%');
})->get();
这样你只会得到 Blog
其中有一些评论 content
像 foo。希望这就是您要找的。