Laravel when()辅助函数在$request->sort值为0时异常执行问题求解
问题根源
核心是两个问题叠加导致的异常:
- PHP弱类型比较的特性坑:你在
when中使用了松散比较!= 0,当$request->sort的值是name#ASC这类非数字开头的字符串时,PHP做松散比较会自动将字符串转为整型,非数字开头的字符串转整型结果为0,最终"name#ASC" != 0的判断结果为false,导致选中排序选项时回调不执行,筛选功能失效。 - 页面初始化请求未传参数:
mounted生命周期中你发送的axios请求没有携带sort和category参数,此时后端$request->sort的值为null。如果将判断条件改为== 0,松散比较下null == 0的结果为true,会直接执行排序回调,对null执行explode操作会报错,返回500状态码。
修复方案
后端代码修改
将排序的when判断改为严格比较,同时先判断参数是否存在且非空:
->when($request->filled('sort') && $request->sort !== '0', function ($q) use ($request){ $o = explode('#',$request->sort); $q->orderBy($o[0], $o[1]); })
- 用
$request->filled('sort')保证参数存在且不为空,避免初始化请求无参数时触发回调 - 用严格比较
!==避免自动类型转换,直接和字符串'0'做对比,匹配前端默认的排序选项值
可选前端优化(非必须)
为了避免前后端类型不一致的隐患,可以将vue中sort的初始值改为字符串'0',和select选项的value类型保持统一:
data:{ students: {}, pages: [], sort: '0', // 从数字0改为字符串'0' category: 0 },
同时mounted阶段的请求可以统一携带默认参数,避免后端参数判断的冗余:
mounted(){ axios.post('/api/get-students',{ sort: this.sort, category: this.category }) .then(res =>{ this.students = res.data.data; this.pages = res.data.links; console.log(res.data.links); }) },
内容的提问来源于stack exchange,提问作者qsm14
相关产品推荐
相关产品推荐

