void
void

Reputation: 913

Laravel Filter using various relations

I am doing a filter using relations here is my controller code:

$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();

In this case(in my code) i am trying to use whereHas() to filter a data from another table(within relations) by eloquent but it's something i am missing:

Upvotes: 1

Views: 27

Answers (1)

Dilip Hirapara
Dilip Hirapara

Reputation: 15296

here in your case, when you use Wherehas to userMetaData it'll filter and gives you only those users who's has city as $request->sport..

In another case, you've used with('userMetaData') which means whatever users you got in filter return all 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);
        }]);
    }) 

Remove userMetaData from User::with(['role','userBet','userComission','userPartnership'])

Upvotes: 1

Related Questions