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

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记录的Contract
  • whereColumn用来精准锁定订单方的签名(避免和承包方的签名混淆)
  • 最后加上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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:10:04