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
相关产品推荐
相关产品推荐

