You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:05:04