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

Laravel中多个when()查询子句如何改为AND逻辑实现多条件筛选?

问题根源

你当前写法生成的SQL存在逻辑优先级问题,AND的运算优先级高于OR,当同时传入两个搜索参数时,最终执行的逻辑会变成满足name条件 或 (满足部分name条件且满足部分surname条件) 或 满足surname条件,自然返回的是结果并集。

解决方法

你只需要把每个when闭包内的OR条件套一层分组where,即可保证两组条件之间是AND关联,组内是OR关联,完全符合你的搜索逻辑:

->when($nameSearch, function ($query, $nameSearch) {
    return $query->where(function ($groupQuery) use ($nameSearch) {
        // 可根据你的实际表字段调整,这里已对齐你需求中的name_kanji/name_romaji字段
        $groupQuery->where('name_kanji', 'LIKE', '%' . $nameSearch . '%')
            ->orWhere('name_romaji', 'LIKE', '%' . $nameSearch . '%');
    });
})
->when($surnameSearch, function ($query, $surnameSearch) {
    return $query->where(function ($groupQuery) use ($surnameSearch) {
        // 可根据你的实际表字段调整,这里已对齐你需求中的surname_kanji/surname_romaji字段
        $groupQuery->where('surname_kanji', 'LIKE', '%' . $surnameSearch . '%')
            ->orWhere('surname_romaji', 'LIKE', '%' . $surnameSearch . '%');
    });
})

逻辑说明

修改后同时传入两个参数时,生成的SQL逻辑为:
WHERE (name_kanji LIKE ? OR name_romaji LIKE ?) AND (surname_kanji LIKE ? OR surname_romaji LIKE ?)
单参数传入时,会自动省略另一组条件,不会影响原有单条件搜索效果。

如果你实际表中存名字罗马音的字段是name而非name_romaji,存姓氏罗马音的字段是surname而非surname_romaji,直接替换分组内的字段名即可,逻辑无需调整。

内容的提问来源于stack exchange,提问作者Massimiliano Bartolini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:09:03