Laravel 如何仅在模型关联存在时对关联数据执行条件查询
问题分析
你之前的查询逻辑错误出在使用了orWhereHas,这会让查询条件变成「installer_id不为空 或者 存在符合条件的关联Assignment」,不符合「installer_id不为空是必填前提」的要求。
需求对应查询逻辑
你需要的查询条件组合是:
installer_id不为空- 同时满足以下两个条件之一:
- 不存在关联的Assignment记录
- 存在至少一条关联的Assignment记录的
status不等于2
实现代码
基于你已经定义好的assignments远程关联,可以直接用以下写法:
$schedulables = Survey::whereNotNull('installer_id') ->where(function ($query) { // 没有关联Assignment 或者 存在status不等于2的关联Assignment $query->whereDoesntHave('assignments') ->orWhereHas('assignments', function ($q) { $q->where('status', '!=', 2); }); }) ->get();
如果不想用远程关联,直接用原来的嵌套关联写法也可以:
$surveys = Survey::whereNotNull('installer_id') ->where(function ($query) { $query->whereDoesntHave('installation.assignments') ->orWhereHas('installation', function ($q) { $q->whereHas('assignments', function ($subQ) { $subQ->where('status', '!=', 2); }); }); }) ->get();
内容的提问来源于stack exchange,提问作者nellytadi
相关产品推荐
相关产品推荐

