Example you have two filter
- Shelf
- Shelf Compartment
public function filters(): array
{
return [
SelectFilter::make('Shelf')
->setFilterPillTitle('Shelf')
->options($this->getShelfOptions())
->filter(function (Builder $builder, string $value) {
if ($value) {
$builder->whereHas('compartment.shelf', function ($query) use ($value) {
$query->where('id', $value);
});
}
})
->setFilterDefaultValue(''),
SelectFilter::make('Compartment')
->setFilterPillTitle('Compartment')
->options($this->getCompartmentOptions())
->filter(function (Builder $builder, string $value) {
if ($value) {
$builder->where('compartment_id', $value);
}
}),
];
}
public function getShelfOptions(): array
{
return ['' => 'All Shelves'] + LibraryShelf::active()
->orderBy('shelf_no')
->pluck('shelf_no', 'id')
->toArray();
}
public function getCompartmentOptions(): array
{
return ['' => 'All Compartments'] + LibraryShelfCompartment::query()
->when($this->shelfFilterValue, fn ($query) => $query->where('shelf_id', $this->shelfFilterValue))
->with('shelf')
->orderBy('shelf_id')
->orderBy('compartment_no')
->get()
->mapWithKeys(fn ($compartment) => [
$compartment->id => ($compartment->shelf ? 'Shelf '.$compartment->shelf->shelf_no : 'Unknown Shelf')
.' - Compartment '.$compartment->compartment_no,
])
->toArray();
}
public function updatedFilterComponents($value, string $filterName): void
{
if ($filterName === 'shelf') {
$this->shelfFilterValue = $value;
$this->setFilter('compartment', '');
}
}
Solution above worked
i tried using
// ->when($this->getAppliedFilterWithValue('shelf'), fn ($query) => $query->where('shelf_id', $this->getAppliedFilterWithValue('shelf')))
instead of
->when($this->shelfFilterValue, fn ($query) => $query->where('shelf_id', $this->shelfFilterValue))
but this crashed