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

Laravel when()辅助函数在$request->sort值为0时异常执行问题求解

问题根源

核心是两个问题叠加导致的异常:

  1. PHP弱类型比较的特性坑:你在when中使用了松散比较!= 0,当$request->sort的值是name#ASC这类非数字开头的字符串时,PHP做松散比较会自动将字符串转为整型,非数字开头的字符串转整型结果为0,最终"name#ASC" != 0的判断结果为false,导致选中排序选项时回调不执行,筛选功能失效。
  2. 页面初始化请求未传参数: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:00:01