2 回答
TA贡献1998条经验 获得超6个赞
据我所知,您需要一个类似于以下内容的查询:
$users = User::with('userProfile')
->whereBetween('age', [$minAge, $maxAge])
->whereHas('userProfile', function($query){
$query->whereBetween('height', [$minHeight, $maxHeight]);
});
这将获取所有用户的个人资料,其中用户的年龄介于$minAge和 之间$maxAge,个人资料的身高介于$minHeight和之间$maxHeight。
编辑
如果您希望能够使用文件管理器单独检索数据,那么您需要的是条件子句。代码看起来像这样:
$users = User::with('userProfile')
->when($ageFilterActive, function($query, $ageFilterActive) {
$query->whereBetween('age', [$minAge, $maxAge]);
})->when($heightFilterActive, function($query, $heightFilterActive) {
$query->whereHas('userProfile', function($query){
$query->whereBetween('height', [$minHeight, $maxHeight]);
});
});
我希望我没有搞乱语法,但你明白了。if-else或者,您可以通过扩展变量的语句来实现相同的目的$query,但我个人更喜欢whenLaravel 的优雅语法。
TA贡献1725条经验 获得超7个赞
我会做以下事情:
从控制器中提取此逻辑并将其放入用户模型中。
由于您在控制器中对用户模型使用依赖注入,因此您可以在控制器中执行类似的操作
$user->filter($request->input('min_height'),$request->input('max_height'),$request->input('min_age'),$request->input('max_age'));
这样,控制器将负责将所需的数据传递给模型,然后您可以在模型内部进行查询。
这样做的好处是
更清晰的控制器
控制器将只负责接收请求、传递所需的数据并将结果传递给索引。
只要您拥有用户实例,您就可以在任何地方重复使用此过滤器
责任将在模型和控制器之间分配,控制器不会做所有事情
在您的用户模型中,查询将如下所示:
public function scopeWithUserProfile($query)
{
// Left join or inner join depends on your needs
return $query->join('user_profile', 'users.id', '=', 'user_profile.user_id');
}
public function filter($minHeight, $maxHeight, $minAge, $maxAge) {
$query = $this->query()
->withUserProfile();
if (!is_null($minHeight) && !is_null($maxHeight)) {
$query->whereBetween('height', [$minHeight, $maxHeight]);
}
if (!is_null($minAge) && !is_null($maxAge)) {
$query->whereBetween('age', [$minAge, $maxAge]);
}
return $query;
}
我们返回 eloquent 实例而没有这样做的原因
$query->get()
是,通过这种方式,我们可以在控制器中执行此操作,并且对于重用此代码的每个地方,我们可以根据需要执行诸如orderBy
、groupBy
、first
和其他操作之类的操作get
我们调用它的地方。因为如果你做了一个,$query->get()
你就会受到唯一的限制Collection
。之后,我们可以在控制器中执行类似的操作
$query->get()
,然后从那里我们将收集所需的数据。
在最后的控制器中你必须有这样的东西
public function search(Request $request, User $user)
{
$user->filter($request->input('min_height'),$request->input('max_height'),$request->input('min_age'),$request->input('max_age'));
return view('your.view.here', [
'userData' => $user->get(),
]);
}
我不知道解释是否足够清楚,但只要我能,我将非常乐意回答您的任何问题:P
我希望语法没问题,但您可以通过添加更多 If 和 else 语句来根据需要过滤它们来满足您的需求。
- 2 回答
- 0 关注
- 116 浏览
添加回答
举报