You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:06:47