如何在Laravel中实现带分组OR条件的SQL查询
多字段搜索功能的条件分组问题
需求与问题
需要实现支持用户可选多字段的搜索功能,期望生成的SQL为:
SELECT * FROM products WHERE (shop_category_id = ? OR shop_category_id = ?) AND (/* 文本搜索LIKE条件 */)
但当前代码生成的SQL中,类别ID条件是以AND连接,而非预期的分组OR连接,导致筛选逻辑错误:
SELECT * FROM products WHERE shop_category_id = ? AND shop_category_id = ? AND (/* 文本搜索LIKE条件 */)
现有代码
$categories = $request->input('category'); // array(int) $textSearch = $request->input('text'); // string $query = Product::query(); if(!is_null($categories)){ //$query->selectSub(); foreach($categories as $catId){ $category = ShopCategory::find($catId); $query = $query->whereBelongsTo($category);//TODO } } if(!is_null($textSearch)){ $query = $query->whereAny([ 'name', 'description', 'shortDescription', ], 'like', '%'.$textSearch.'%'); } $searchResults = $query->paginate(36);
解决方案
通过闭包创建嵌套的WHERE子句,将所有类别筛选条件用OR包裹在一个分组内,确保和外部的文本搜索条件保持AND关系,最终代码如下:
$mainQuery->where(function($query) use ($categories) { foreach ($categories as $catId) { $category = ShopCategory::find($catId); $query->orWhereBelongsTo($category); } });
内容的提问来源于stack exchange,提问作者Snappawapa
相关产品推荐
相关产品推荐

