Laravel多条件可选搜索执行后始终返回空数组问题求解
问题排查点
when回调的变量作用域错误
你当前写法里把外部变量直接写在回调的参数列表中是错误的:Laravel的when()方法回调的第二个参数会自动传入when()第一个判断条件的返回值,并非你预期的外部变量。你需要用use关键词引入外部变量,正确写法示例:
->when($category != 0, function ($query) use ($category) { return $query->where('category_id', $category); })
你所有的when回调都存在这个错误,导致传入查询的参数和你预期的外部变量完全不一致,自然查不到结果。
- 字段匹配错误
你在处理body_type筛选条件时,错误把筛选字段写为model,导致车身类型的筛选被错误应用到车型字段上,直接引发结果不匹配:
// 错误写法 ->when($body_type != 0,function ($query,$body_type){return $query->where('model', $body_type);}) // 修正后 ->when($body_type != 0,function ($query) use ($body_type){return $query->where('body_type', $body_type);})
- 判断条件不符合实际传值情况
你所有可选参数的判断都是基于!=0/>0,如果前端传的空值是null、空字符串""这类值,PHP弱类型比较时null == 0会返回true,导致本来应该生效的筛选没有生效,或者不该生效的筛选错误触发。建议把判断条件改为判断参数是否存在有效值,比如:
// 数字类型参数判断示例 ->when(!empty($category) && $category != 0, function ($query) use ($category) { // 金额/年份等正数参数判断示例 ->when(!empty($min_price) && $min_price > 0, function ($query) use ($min_price) {
- 固定筛选条件不匹配
检查你最后加的固定条件where('approval','Approved'):确认数据库中approval字段的存储值是否和你写的完全一致,比如是否存为小写approved、数字1等不匹配的内容。 - 关键词参数异常
确认$keyword变量是否有有效值,如果$keyword为null,拼接后的LIKE条件会变成%null%,只能匹配标题里包含null字符串的内容,自然没有结果。
调试建议
你可以先把查询末尾的->get()替换为->toSql(),打印出最终生成的SQL语句,直接核对WHERE条件是否符合你的预期,就能快速定位是参数错误还是字段错误。
内容的提问来源于stack exchange,提问作者new
相关产品推荐
相关产品推荐

