Reputation: 53
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
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