如何使用Query Builder在Lumen API中实现高级筛选?
在Lumen API中用Query Builder实现高级筛选功能
嘿,我来帮你搞定这个需求!要根据请求参数(比如product_group)筛选产品,我们可以通过动态构建查询来实现,既灵活又能保持代码简洁。下面是一步步的修改方案:
步骤1:注入Request实例
首先,要在控制器方法里注入Illuminate\Http\Request实例,这样才能轻松获取URL里的查询参数。
步骤2:动态构建筛选查询
不要直接调用get()返回所有数据,先初始化查询构建器实例,然后根据是否存在筛选参数来动态添加where条件——这样有参数时筛选,无参数时返回全部,非常灵活。
步骤3:保持原有返回结构
筛选完成后,再对结果进行分组,保持你原来返回的categories和products格式不变。
修改后的完整控制器代码
use Illuminate\Http\Request; public function index(Request $request) { // 初始化产品查询构建器 $query = DB::table('tlt_products'); // 检查是否存在product_group筛选参数,有则添加筛选条件 if ($productGroup = $request->query('product_group')) { $query->where('product_group', $productGroup); } // 执行查询,获取筛选后的产品数据 $filteredProducts = $query->get(); // 处理分类:如果只需要筛选后的分组,用distinct+pluck;要全部分组就单独查一次无筛选的 $tlt_product_groups = $query->distinct('product_group')->pluck('product_group')->toArray(); // 对筛选后的产品按product_group分组 $tlt_products = $filteredProducts->groupBy('product_group')->toArray(); return response()->json([ 'categories' => $tlt_product_groups, 'products' => $tlt_products ]); }
代码细节解释
- 参数获取:通过
$request->query('product_group')拿到URL里的筛选参数,比如你示例中的network。 - 动态筛选:用
if判断参数是否存在,存在就追加where条件,避免无参数时做多余筛选。 - 分类处理:用
distinct('product_group')+pluck()获取唯一的产品分组,确保分类和筛选后的产品对应;如果需要保留全部分组,单独写一个不带筛选的查询即可。 - 结构兼容:最后返回的
categories和products格式和你原来的代码完全一致,前端无需调整。
扩展:支持更多筛选条件
如果以后要加其他筛选(比如价格范围、产品状态),只需要继续添加类似的判断就行:
// 示例:添加价格区间筛选 if ($minPrice = $request->query('min_price')) { $query->where('price', '>=', $minPrice); } if ($maxPrice = $request->query('max_price')) { $query->where('price', '<=', $maxPrice); }
这样你的API就具备灵活的高级筛选能力啦!
内容的提问来源于stack exchange,提问作者Dominykas Česonis
相关产品推荐
相关产品推荐

