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

Laravel中ModelA基于name字段的when条件查询异常问题

问题

我有一个包含name、last_name、email字段的ModelA模型,想要对name为Test的ModelA记录额外添加email字段的查询条件。尝试了以下代码:

$model_a_res = A::when(
    function($query){
        return $query->where('name','Test');
    },
    function ($query) { 
        $query->where('email', 'NOT LIKE', '%@test%');})
->first();

但代码无法正常工作:查询时name为Mike且邮箱为mike@test.com的记录未出现在结果中。现有测试数据:

id name email
1 Test test@test.com 
2 Test something@hotmail.com
3 Mike mike@test.com
4 Mike mike@hotmail.com

预期返回记录为2、3、4,即name为Mike的全部记录,以及name为Test且邮箱不含@test的记录。

解决方法

你之前的when用法错误,第一个闭包返回的是查询构造器实例,会被判定为true,导致email的过滤条件被应用到所有记录,这才把Mike的mike@test.com给排除了。

正确的逻辑应该是:要么name不是Test,要么name是Test且email不包含@test。可以用分组查询来实现:

$model_a_res = A::where(function($query) {
    $query->where('name', '!=', 'Test')
          ->orWhere(function($subQuery) {
              $subQuery->where('name', 'Test')
                       ->where('email', 'NOT LIKE', '%@test%');
          });
})->get();

这个分组查询会准确筛选出:所有name不是Test的记录,加上name是Test且email不含@test的记录,完全符合你的预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:35:08