Erron Intila
Erron Intila

Reputation: 53

How to filter all and specific fields using Laravel Eloquent?

I want to refactor my source code when filtering records in all and specific fields. Currently, I'm filtering all fields by passing 'search' in my request:
GET request: /api/users?search=

public function index(Request $request) {
    $search = request("search") ?? "";
    $users = $users->where(function ($query) use ($search) {
        $query->where('code', "like", "%" . $search . "%");
        $query->orWhere("first_name", "like", "%" . $search . "%");
        $query->orWhere("last_name", "like", "%" . $search . "%");
        $query->orWhereHas('department', function ($q) use ($search) {
            $q->where('name', "like", "%" . $search . "%");
        });
    });
    return $users->paginate(10);
}

I tried to follow this article, and now my GET request should be: /api/users?first_name=Juan&last_name=Cruz
Should I pass all request like /api/users?all=Juan to filter all fields at once?

What is the best approach when applying this kind of functionality?
If you know any acticles/resources which can serve as my reference, it would be a great help.

Upvotes: 1

Views: 1113

Answers (1)

Mateus Junges
Mateus Junges

Reputation: 2602

If you are following the article you shared, your url should look like /users?name=John&last_name=Doe&code=123

Then, you just call User::filter($filters)->get(), and it will automatically apply your query string filters to the query.

If you dont want to implement the filters functionality, you can use eloquent when method. It only apply the filter when a given condition is true.

public function index(Request $request) {
    $query = User::query();
    $query = $query->when(request('code'), function($query) {
        $query->where('code', "like", '%'.request('code').'%')
    })
    ->when(request('first_name'), function($query) {
        $query->where('first_name', 'like', '%'.request('first_name').'%');  
    })
    ->when(request('last_name'), function($query) {
        $query->where('last_name', 'like', '%'.request('last_name').'%');  
    })
    ->when(request('department'), function($query) {
        $query->where('last_name', 'like', '%'.request('last_name').'%');  
    })
    ->when(request('department'), function($query) {
        $query->whereHas('department', function($query) {
            $query->where('name', 'like', '%'.request('department').'%');
        });  
    });
    
    return $query->paginate(10);
}

Upvotes: 0

Related Questions