I'm working with Laravel and have defined a model scope named scopeFilter in my User model. I'd like to rename it to a simpler Filter scope.
In my controller, I'm using this scope to filter users. However, I'm facing an issue when the selected filter value is "-1". In this case, I want the filter parameter to be removed entirely from the URL
public function scopeFilter(Builder $query,array $filters)
{
if(isset($filters['selected'])){
$query->whereHas('roles', function (Builder $query) use($filters){
$query->where('name',$filters['selected'])->whereIn('name',AdminRolesEnum::cases());
});
}
$query->whereHas('roles', function (Builder $query){
$query->whereIn('name',AdminRolesEnum::cases());
});
return $query;
}
public function index(Request $request)
{
Gate::authorize('showAdmin',User::class);
$filters = [
'selected' => $request->has('selected') ? $request->query('selected'): null ,
];
$admins = User::filter($filters)->paginate(3);
return view('admin.index', ['admins' => $admins, 'roles' => Role::all()]);
}
<form id="myForm" action="{{ route('admin.index') }}" method="GET" >
<select class="form-select" aria-label="Default select example" id="selected" name="selected" onchange="this.form.submit()">
<option @selected(request('selected') == "-1") value=-1>Role Filter</option>
@foreach ($roles as $role )
<option @selected(request('selected') == $role->name) value="{{ $role->name }}">{{ $role->name }}</option>
@endforeach
</select>
</form>