如何在Vapor中实现可选查询过滤?寻求更简洁写法
Vapor 查询简化实现方案
你想要的带enable参数的filter方法Vapor原生并未提供,但可以通过以下几种方式实现更简洁的写法:
1. 扩展QueryBuilder实现自定义filter
通过扩展QueryBuilder,添加支持开关控制的过滤方法:
extension QueryBuilder where Model: Content { func filter(_ filterClosure: @escaping (Self) -> Self, enable: Bool) -> Self { enable ? filterClosure(self) : self } }
之后就能直接使用你设想的写法:
return try await Post.query(on: req.db) .filter({ $0.filter(\.$board.$id == boardId) }, enable: needFilter) .with(\.$profile) .all()
2. 利用Swift三元运算符简化
不用扩展,直接用三元运算符在链式调用中处理:
return try await (needFilter ? Post.query(on: req.db).filter(\.$board.$id == boardId) : Post.query(on: req.db)) .with(\.$profile) .all()
或者借助apply方法保持链式风格:
return try await Post.query(on: req.db) .apply(needFilter ? { $0.filter(\.$board.$id == boardId) } : { $0 }) .with(\.$profile) .all()
3. 使用Vapor官方新增的if方法(推荐)
Vapor 4.70及以上版本为QueryBuilder添加了if方法,专门用于条件式修改查询,这是最简洁且易维护的方案:
return try await Post.query(on: req.db) .if(needFilter) { query in query.filter(\.$board.$id == boardId) } .with(\.$profile) .all()
内容的提问来源于stack exchange,提问作者yxk
相关产品推荐
相关产品推荐

