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

