Level 17
@cliffordatcaveodotnl Can you share your solution with sort? I can show cleaner approach with filter if you want
1 like
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
If anyone is struggling with Livewire and Spatie's Query Builder, here's a quick tip on how to get it working with filters:
Component:
<?php
namespace App\Http\Livewire;
use App\Item;
use Livewire\Component;
use Spatie\QueryBuilder\QueryBuilderRequest;
class Table extends Component
{
/** @var QueryBuilderRequest */
protected $request;
/** @var array<string,string> */
public $filter = [];
/** @var array<string> */
protected $updatesQueryString = [
'filter',
];
public function mount(): void
{
$this->filter = $this->request()->query('filter', $this->filter);
}
public function request(): QueryBuilderRequest
{
if (!$this->request) {
$this->request = app(QueryBuilderRequest::class);
}
return $this->request;
}
public function filter(string $filter, ?string $slug): void
{
if (is_null($slug)) {
unset($this->filter[$filter]);
} else {
$this->filter[$filter] = $slug;
}
$this->request()->query->set('filter', $this->filter);
}
public function render(): View
{
$items = QueryBuilder::for(Item::query(), $this->request())
->allowedFilters(Item::allowedFilters())
->get();
return view('livewire.table', compact('items'));
}
}
View:
<a role="button" href="#" wire:click.prevent="filter('filter-name', 'filter-value')">Filter!</a>
<a role="button" href="#" wire:click.prevent="filter('filter-name')">Reset!</a>
Hope this helps!
Please or to participate in this conversation.