Laravel Spatie Searchable 过滤问题:仅展示ADVERTISEMENT分类
Spatie Searchable 添加过滤条件无效的解决方案
我在项目中集成Spatie Searchable,普通搜索功能运行正常,但尝试添加过滤条件(仅展示category_type为ADVERTISEMENT的分类名称)时无法生效,相关代码如下:
控制器代码
<?php namespace App\Http\Livewire\SuperAdmin; use Livewire\Component; use Spatie\Searchable\Search; use App\Models\Category; class SuperAdminSearch extends Component { public $query; public $searchResults = []; public $name = []; public function updated($property) { $this->name = $this->categoryName(); if($property == 'query') { $searchterm = $this->query; $this->searchResults = (new Search()) ->registerModel(Category::class, 'name') ->perform($searchterm); } if(empty($this->query)) { $this->searchResults = []; } } public function render() { return view('livewire.super-admin.super-admin-search'); } }
模型代码
protected $fillable = ['name', 'category_type']; public function getSearchResult(): SearchResult { $url = route('super_admin_category_details', $this->id); return new SearchResult( $this, $this->name, $url ); }
解决方案
Spatie Searchable支持在注册模型时通过闭包自定义查询条件,只需修改registerModel方法的参数,添加过滤逻辑即可:
修改控制器中搜索部分的代码,在registerModel的第三个参数传入闭包,限定category_type为ADVERTISEMENT:
$this->searchResults = (new Search()) ->registerModel(Category::class, 'name', function ($query) { $query->where('category_type', 'ADVERTISEMENT'); }) ->perform($searchterm);
这段闭包会在构建搜索查询时生效,确保返回的结果仅包含符合category_type = 'ADVERTISEMENT'的分类。如果后续有其他过滤需求,也可以在这个闭包里添加更多where条件。
内容的提问来源于stack exchange,提问作者ash
相关产品推荐
相关产品推荐

