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(关系内)过滤数据,但这是我所缺少的:

在你的情况下,当你使用 WherehasuserMetaData 时,它会过滤并只为你提供 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