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
相关产品推荐
相关产品推荐

