Laravel查询问题:传入'all'作为year参数时无法正常执行
解决Laravel中
year参数为all的查询问题 你可以通过动态添加查询条件来处理year参数为all的情况,同时还要修正原代码里的逻辑错误(orWhere位置不当会导致查询逻辑混乱),具体修改如下:
修正后的控制器代码
public function findResultServiceFeeDubai($address, $type, $year, $norows){ $result = DB::table('service-charges') ->select('address', 'year', 'type', 'total_charge_sqft') ->where(function($query) use ($address) { $query->where('address', 'LIKE', "%{$address}%"); }) ->where('type', $type) // 仅当year不是all时,才添加年份筛选条件 ->when($year !== 'all', function($query) use ($year) { $query->where('year', $year); }) ->limit($norows) ->get(); return response()->json($result, 200); }
关键说明
- 动态条件处理:用
when()方法实现逻辑分支——当$year不等于all时,自动添加年份筛选;如果是all,则跳过该条件,自然查询所有年份的数据。 - 修正逻辑冲突:把地址的模糊查询放到闭包
where(function($query) {...})里,避免原代码中orWhere和后续where的逻辑冲突,保证查询规则是「地址匹配 且 类型匹配 且(年份匹配/所有年份)」。
可选优化:路由参数名统一
路由里的{name}参数和控制器的$address参数名不一致,建议改成一致的,方便后续维护:
Route::get('/findResultServiceFeeDubai/{address}/{type}/{year}/{norows}',[UserController::class,'findResultServiceFeeDubai'])->name('findResultServiceFeeDubai');
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

