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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:21:00