Laravel Blade仅返回Slug部分内容,求排查问题根源
根据你描述的情况——控制器返回的地点对象里slug就已经是截断后的内容,说明问题肯定出在数据库存储或者数据读取的上游环节,和Blade模板半毛钱关系都没有。下面是几个最可能的原因,你可以按顺序排查:
数据库字段长度不够导致截断
这是最常见的坑!如果你的slug字段设成了VARCHAR(20)之类的短长度,像anenii-noi-164这种稍长的slug就会被数据库自动砍掉后缀。直接登录数据库工具(比如phpMyAdmin、Navicat),先看表结构里slug字段的长度,再去看原始数据里的slug值是不是完整的——如果数据库里存的本身就只有cahul,那肯定是存储环节出问题了。数据存入时被代码主动截断
检查你的Location模型,看看是不是在creating或者updating事件里加了处理slug的逻辑?比如有人可能为了“简化”slug,写了代码只取-前面的部分;或者控制器里存储数据的时候,错误地调用了某个生成slug的方法,把后缀给丢了。比如有没有类似下面这种坑人的代码:$location->slug = explode('-', $request->slug)[0];查询时被SQL语句截断
看看控制器里获取$locations的代码,比如是不是用了selectRaw或者自定义的查询?比如:Location::select('id', 'name', DB::raw("SUBSTRING_INDEX(slug, '-', 1) as slug"))->get();这种写法会直接在SQL层面把slug截断,返回的自然是去掉后缀的版本。
模型访问器搞的鬼
如果你的Location模型里定义了getSlugAttribute方法,那这个方法会覆盖原始的slug值。比如有人可能写了:public function getSlugAttribute($value) { return explode('-', $value)[0]; }这样不管数据库里存的是什么,取出来的都是截断后的slug。
建议先从数据库原始数据查起,这是最快定位问题的办法!
内容的提问来源于stack exchange,提问作者Ana Maria

