Laravel控制器实现单值/多值动态组合条件查询筛选
Laravel Eloquent 动态多参数查询筛选实现方案
实现思路
利用Laravel查询构造器自带的when方法实现条件动态拼接,无需手动写多层if/else判断参数是否存在,只有对应筛选参数有效时才会将where条件追加到查询中,天然适配单参数、多参数组合的所有筛选场景。
完整实现代码
// 固定拼接所有场景都需要的关联查询,提前初始化查询构造器 $news_paper_machine_ads = newsPaperMachineAds::join('news_paper_district', 'news_paper_district.idnews_paper_district', '=', 'news_paper_machine_ads.news_paper_district_id') ->join('news_paper_city', 'news_paper_city.idnews_paper_city', '=', 'news_paper_machine_ads.news_paper_city_id') ->join('news_paper_machine_field', 'news_paper_machine_field.idnews_paper_machine_field', '=', 'news_paper_machine_ads.news_paper_machine_field_id') // 行政区筛选:参数有效时才生效 ->when($district, function ($query, $districtVal) { return $query->where('district', 'LIKE', "%{$districtVal}%"); }) // 城市筛选:参数有效时才生效 ->when($city, function ($query, $cityVal) { return $query->where('news_paper_city', 'LIKE', "%{$cityVal}%"); }) // 设备领域筛选:参数有效时才生效 ->when($machine_field, function ($query, $fieldVal) { return $query->where('machine_field', 'LIKE', "%{$fieldVal}%"); }) ->get();
适配场景说明
该实现完全覆盖所有动态传参需求:
- 仅传入
district/city/machine_field任意一个参数时,仅拼接对应单条件筛选 - 传入任意两个参数时,自动拼接两个条件做组合筛选
- 三个参数同时传入时,拼接三个条件做精准匹配
- 三个参数均为空/未传入时,不追加任何筛选条件,返回全量关联数据
优化提示
- 如果参数从Request请求中获取,可以直接使用
$request->input('参数名')作为when的第一个判断值,无需提前单独赋值;如果需要严格判断参数存在且不为空字符串,可以替换判断逻辑为$request->filled('参数名'),避免空字符串触发无效筛选。 - 固定的join逻辑因为所有筛选场景都需要关联三张附表取字段,放在动态条件前固定拼接即可,不会影响筛选逻辑的正确性。
内容的提问来源于stack exchange,提问作者Kasun Tharaka
相关产品推荐
相关产品推荐

