以下是我的代码:

var query = Post.query(on: req.db)

if needFilter == true {
     query = query.filter(\.$board.$id == boardId)
}
    
return try await query
                 .with(\.$profile).all()

上面的代码有点复杂.有没有办法把它写成这样的❓:

return try await query
                 .filter(\.$board.$id == boardId, enable: needFilter)
                 .with(\.$profile).all()

‘Enable:’表示此过滤器打开/关闭.

还是有其他方法可以做到这一点?有什么方便的方法吗?

先谢谢你.

推荐答案

您可以这样实现:

return try await query
    .filter { needFilter ? $0.$board.$id == boardId : true }
    .with(\.$profile)
    .all() 

编辑: 或者,如果您想要一种可靠的方式:

您可以为QueryBuilder创建一个扩展,添加一个定制的filterIf方法,该方法接受Bool参数enableFilterIf和过滤条件的闭包.下面是一个如何做到这一点的例子:

import Vapor

extension QueryBuilder where Model: Fluent.Model {
    @discardableResult
    func filterIf(_ enableFilterIf: Bool, _ condition: (QueryBuilder<Model>) throws -> ()) rethrows -> Self {
        if enableFilterIf {
            try condition(self)
        }
        return self
    }
}

下面是如何使用此扩展的方法:

return try await query
    .filterIf(needFilter) { query in
        query.filter(\.$board.$id == boardId)
    }
    .with(\.$profile)
    .all()

Swift相关问答推荐

Swift concurrency reload/await,支持只执行成功并重试

如何在SwiftUI 4+(iOS 16+)中使用新的NavigationStack进行导航

如何在visionOS中将模型锚定在用户头部上方?

协议元类型'SomeProtocol.Type'上无法使用静态成员'currency'

Swift-SceneKit-无法从art.scnassets加载.scn文件

在 Vapor 4 中使用协议的通用流利查询

创建 ViewModel 时 iOS 模拟器上的黑屏

持久化字符串列表属性 RealmSwift

如何使 SwiftUI Picker 换行文本

如何以快速 Select 器菜单样式调整图像大小

如何在 SwiftUI 中通过按钮点击一次为一个更改设置动画?

如何从元组数组创建字典?

如何在 Swift 中将 UILabel 居中?

如何在 SwiftUI 中以编程方式滚动列表?

如何在 SwiftUI 中创建带有图像的按钮?

使用 Swift 以编程方式自定义 UITableViewCell

自定义 Google 登录按钮 - iOS

Swift 的 JSONDecoder 在 JSON 字符串中有多种日期格式?

SwiftUI:将多个 BindableObjects 放入环境

如何快速显示数组的所有元素?