Laravel - Query Builder - Conditional Clauses
Sometimes you may want certain query clauses to apply to a query based on another condition. For instance, you may only want to apply a where
statement if a given input value is present on the incoming HTTP request. You may accomplish this using the when
method:
$role = $request->input('role');
$users = DB::table('users')
->when($role, function ($query, $role) {
return $query->where('role_id', $role);
})
->get();
The when
method only executes the given closure when the first argument is true
. If the first argument is false
, the closure will not be executed. So, in the example above, the closure given to the when
method will only be invoked if the role
field is present on the incoming request and evaluates to true
.
You may pass another closure as the third argument to the when
method. This closure will only execute if the first argument evaluates as false
. To illustrate how this feature may be used, we will use it to configure the default ordering of a query:
$sortByVotes = $request->input('sort_by_votes');
$users = DB::table('users')
->when($sortByVotes, function ($query, $sortByVotes) {
return $query->orderBy('votes');
}, function ($query) {
return $query->orderBy('name');
})
->get();