Laravel嵌套关联场景下如何调整whereDoesntHave生成符合预期的SQL
你原来的whereDoesntHave('user.trainer')逻辑是排除「关联了user且该user关联了trainer」的产品,会把没有关联user的产品也包含到结果里,和你需要的「必须关联user且该user没有关联trainer」逻辑不一致。
正确的查询写法如下:
$products->whereHas('user', function ($query) { $query->whereDoesntHave('trainer'); });
逻辑说明
- 外层
whereHas('user')对应你期望SQL里的第一层exists,筛选出有关联user的产品 - 内层闭包里的
whereDoesntHave('trainer')对应第二层not exists,限制关联的user不存在对应的trainer记录
生成的SQL会完全匹配你给出的期望语句:
select * from `products` where exists ( select * from `users` where `products`.`user_id` = `users`.`id` and not exists ( select * from `trainers` where `users`.`id` = `trainers`.`user_id` ) )
如果是Laravel 9及以上版本,还可以用更简洁的箭头函数写法:
$products->whereHas('user', fn($q) => $q->whereDoesntHave('trainer'));
内容的提问来源于stack exchange,提问作者kodfire
相关产品推荐
相关产品推荐

