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
相关产品推荐
相关产品推荐

