Laravel 使用各种关系进行过滤
Laravel Filter using various relations
我正在使用关系做一个过滤器,这里是我的控制器代码:
$userList = User::with(['role' ,'userMetaData','userBet','userComission','userPartnership'])
->where('deleted', '=', '0')
->when($request->parent_id, function ($builder, $parent_id) {
return $builder->where('parent_id', $parent_id);
})
->when($request->role_id, function ($builder, $role_id) {
return $builder->where('role', $role_id);
})
->when($request->to && $request->from , function ($builder) use ($request) {
return $builder->whereBetween('exposure_limit', [$request->from, $request->to]);
})
->when($request->city, function ($builder) use ($request) {
return $builder->whereHas('userMetaData', function($query) use ($request){
$query->where('city', $request->sport);
});
})
->orderBy('created_at', 'DESC')
->get();
在这种情况下(在我的代码中)我正在尝试使用 whereHas()
通过 eloquent 从另一个 table(关系内)过滤数据,但这是我所缺少的:
在你的情况下,当你使用 Wherehas
到 userMetaData
时,它会过滤并只为你提供 city
作为 $request->sport
..
在另一种情况下,您使用了 with('userMetaData')
,这意味着您在过滤器 return 中获得的所有用户都是 userMetaData
.
->when($request->city, function ($builder) use ($request) {
return $builder->whereHas('userMetaData', function($query) use ($request){
$query->where('city', $request->sport);
})->with(['userMetaData' => function($q) use ($request) {
$q->where('city', $request->sport);
}]);
})
从 User::with(['role','userBet','userComission','userPartnership'])
中删除 userMetaData
我正在使用关系做一个过滤器,这里是我的控制器代码:
$userList = User::with(['role' ,'userMetaData','userBet','userComission','userPartnership'])
->where('deleted', '=', '0')
->when($request->parent_id, function ($builder, $parent_id) {
return $builder->where('parent_id', $parent_id);
})
->when($request->role_id, function ($builder, $role_id) {
return $builder->where('role', $role_id);
})
->when($request->to && $request->from , function ($builder) use ($request) {
return $builder->whereBetween('exposure_limit', [$request->from, $request->to]);
})
->when($request->city, function ($builder) use ($request) {
return $builder->whereHas('userMetaData', function($query) use ($request){
$query->where('city', $request->sport);
});
})
->orderBy('created_at', 'DESC')
->get();
在这种情况下(在我的代码中)我正在尝试使用 whereHas()
通过 eloquent 从另一个 table(关系内)过滤数据,但这是我所缺少的:
在你的情况下,当你使用 Wherehas
到 userMetaData
时,它会过滤并只为你提供 city
作为 $request->sport
..
在另一种情况下,您使用了 with('userMetaData')
,这意味着您在过滤器 return 中获得的所有用户都是 userMetaData
.
->when($request->city, function ($builder) use ($request) {
return $builder->whereHas('userMetaData', function($query) use ($request){
$query->where('city', $request->sport);
})->with(['userMetaData' => function($q) use ($request) {
$q->where('city', $request->sport);
}]);
})
从 User::with(['role','userBet','userComission','userPartnership'])
userMetaData