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

Laravel Sluggable包大小写不敏感失效问题求助

解决Laravel Sluggable包大小写重复内容生成不同Slug的问题

我之前也碰到过一模一样的问题!核心原因是Sluggable默认会区分大小写来生成和校验slug,所以myFlower和myflower会被当成不同的内容处理。这里有两个实用的解决思路,你可以根据需求选择:

方法一:强制生成小写Slug(推荐)

直接让Sluggable生成slug时统一转为小写,从根源避免大小写导致的重复问题。修改你的sluggable()方法即可:

public function sluggable()
{
    return [
        'slug' => [
            'source' => 'name',
            'lowercase' => true, // 开启强制小写转换
            'unique' => true // 确保slug唯一(默认已开启,明确声明更清晰)
        ]
    ];
}

开启lowercase参数后,不管原name是myFlower还是myflower,最终生成的slug都会是myflower,自然不会出现重复的不同slug了。

方法二:忽略大小写校验唯一性

如果需要保留slug的大小写格式,但又想让系统识别大小写不同的内容为同一类,可以重写Sluggable的唯一性查询逻辑:

protected function getSlugUniqueQuery(\Illuminate\Database\Eloquent\Builder $query, $slug)
{
    // 将数据库中的slug和当前生成的slug都转成小写后比较
    return $query->whereRaw('LOWER(slug) = ?', [strtolower($slug)]);
}

这样当你尝试创建myflower时,系统会检测到数据库中已存在MyFlower的slug,自动为新内容生成带后缀的slug(比如myflower-1)。

额外注意:处理已有数据

如果你的数据库中已经存在大小写不同的重复slug,建议批量更新为统一格式(比如全小写),避免后续路由匹配或查询出现异常:

// 可在artisan命令或临时迁移中执行以下代码
testController::query()->update([
    'slug' => \Illuminate\Support\Facades\DB::raw('LOWER(slug)')
]);

内容的提问来源于stack exchange,提问作者Shokouh Dareshiri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:38:10