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

Vapor Fluent如何查询关联Invoice为nil或已激活的Transaction

解决方案

可以直接通过Fluent的查询构建器实现这个需求,不需要手动过滤或发起多次请求,核心是利用分组OR条件结合关联查询来完成:

let transactions = try await Transaction.query(on: req.db)
    .group(.or) { group in
        // 条件1:invoice为nil(对应数据库中invoice_id字段为null)
        group.filter(\.$invoice == nil)
        // 条件2:关联的Invoice模型isActive属性为true
        group.join(Invoice.self, on: \Transaction.$invoice.$id == \Invoice.$id)
            .filter(Invoice.self, \.$isActive == true)
    }
    .all()

代码说明

  • group(.or)用来包裹两个并列条件,只要满足其中一个就会被筛选出来
  • 第一个条件直接通过\.$invoice == nil过滤出没有关联Invoice的Transaction记录
  • 第二个条件先通过join关联Transaction和Invoice表,再过滤出关联Invoice的isActive为true的记录

如果需要同时加载关联的Invoice模型(仅对有Invoice的记录生效),可以在查询末尾追加.with(\.$invoice):

let transactions = try await Transaction.query(on: req.db)
    .group(.or) { group in
        group.filter(\.$invoice == nil)
        group.join(Invoice.self, on: \Transaction.$invoice.$id == \Invoice.$id)
            .filter(Invoice.self, \.$isActive == true)
    }
    .with(\.$invoice) // 加载关联的Invoice数据
    .all()

这种方式只会发起一次SQL查询,相比手动过滤全量数据、多次分组请求的方式,性能和效率都提升很多。

内容的提问来源于stack exchange,提问作者KVISH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:42:33