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

Laravel Scout搜索spatie多语言JSON属性大小写敏感问题求助

解决Laravel Scout结合Spatie Laravel Translatable时的大小写敏感搜索问题

下面提供几种可行的解决方案,根据你使用的Scout驱动(数据库/Meilisearch/Algolia等)选择适配的方案:

方案1:修改模型索引逻辑,统一处理为小写

在你的模型中重写toSearchableArray方法,将多语言字段的所有内容转为小写后加入搜索索引,同时搜索时将关键词也转为小写:

public function toSearchableArray()
{
    $array = $this->toArray();

    // 处理description字段,合并所有语言的小写文本到搜索字段
    if (isset($array['description'])) {
        $array['searchable_content'] = collect($array['description'])
            ->map(fn($text) => strtolower($text))
            ->implode(' ');
    }

    return $array;
}

修改完成后,必须重新生成索引:

php artisan scout:import "App\Models\YourModel"

搜索时统一转小写:

$keyword = strtolower($request->input('search'));
$results = YourModel::search($keyword)->get();

方案2:数据库驱动下直接写不区分大小写的查询

如果使用Scout的数据库驱动,或者直接用Eloquent查询替代Scout搜索,可以通过JSON函数配合LOWER()实现不区分大小写的匹配:

use Illuminate\Database\Eloquent\Builder;

$keyword = "welcome";
$lowerKeyword = strtolower($keyword);

$results = YourModel::where(function(Builder $query) use ($lowerKeyword) {
    // 遍历支持的语言,动态添加查询条件
    foreach (['en', 'ar'] as $locale) {
        $query->orWhereRaw('LOWER(JSON_UNQUOTE(JSON_EXTRACT(description, ?))) LIKE ?', [
            "$.$locale",
            "%{$lowerKeyword}%"
        ]);
    }
})->get();

方案3:针对搜索引擎驱动(Meilisearch/Algolia)配置大小写不敏感

如果使用Meilisearch,在模型中配置搜索选项关闭大小写敏感:

public function searchableOptions()
{
    return [
        'searchableAttributes' => ['description.*'],
        'typoTolerance' => [
            'caseSensitive' => false,
        ],
    ];
}

如果使用Algolia,可以在模型的searchableOptions中配置大小写不敏感:

public function searchableOptions()
{
    return [
        'attributesToIndex' => ['description.*'],
        'caseSensitive' => false,
    ];
}

配置完成后重新执行索引导入即可生效。

内容的提问来源于stack exchange,提问作者Ahmed Eid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:35:29