Eloquent hasMany关联条件查询:筛选订单方未签署的合同
筛选订单方未签署的合同解决方案
嘿,这就给你梳理出两种靠谱的实现方式,都是基于Eloquent的,完美适配你的模型关联结构:
方法一:使用whereHas关联查询(推荐)
这种方式最贴合Eloquent的关联设计,代码可读性高,维护起来也方便:
$unsignedOrdererContracts = Contract::whereHas('signatures', function ($query) { // 关联订单方的签名记录:user_id和合同的orderer_user_id精准匹配 $query->whereColumn('user_id', 'contracts.orderer_user_id') // 筛选未签署状态,这里假设未签署是false,可根据你实际的字段值调整(比如0或'unsigned') ->where('signed', false); })->get();
逻辑说明:
whereHas会自动筛选出至少存在一条符合条件的关联Signature记录的ContractwhereColumn用来精准锁定订单方的签名(避免和承包方的签名混淆)- 最后加上
signed的未签署条件,就能得到所有订单方还没签的合同
方法二:使用表关联查询(Join)
如果更习惯原生SQL风格的写法,也可以用Join来实现:
$unsignedOrdererContracts = Contract::join('signatures', function ($join) { $join->on('signatures.contract_id', '=', 'contracts.id') // 关联订单方的签名记录 ->on('signatures.user_id', '=', 'contracts.orderer_user_id'); }) ->where('signatures.signed', false) // 确保只返回合同表的字段,避免和签名表字段冲突 ->select('contracts.*') // 防止出现重复结果(理论上不会,但加个distinct更稳妥) ->distinct() ->get();
逻辑说明:
- 直接将Contract表和Signature表通过
contract_id以及订单方的user_id关联起来 - 筛选出签名状态为未签署的记录,最后只取合同表的字段即可
两种方法都能满足你的需求,个人更推荐第一种whereHas的写法,因为它完全利用了Eloquent的关联关系,代码更简洁易懂,后续如果模型关联有调整,也更容易维护。
内容的提问来源于stack exchange,提问作者Kirk Olson
相关产品推荐
相关产品推荐

