我有两个模型(UserModel和用户令牌模型)

用户令牌模型有一个指示UserModel的ForeignKey.

这是我的密码.我试图在用户令牌模型上按userModel的Id进行筛选,但出现了一个错误.

运算符函数"=="要求"UUID"符合"QueryableProperty"

if let user = try await UserModel.query(on: req.db).filter(\.$email == request.email).first() {
    //Compile Error: 运算符函数"=="要求"UUID"符合"QueryableProperty"
    let userToken = try await 用户令牌模型.query(on: req.db)
    .filter(\.$user.id == user.$id).first()
}

以下是模型的定义

final class UserModel: Model {
    static let schema = "user_users"
    
    struct FieldKeys {
        static var email: FieldKey { "email" }
        static var password: FieldKey { "password" }
        static var appleId: FieldKey { "appleId" }
        static var givenName: FieldKey { "givenName" }
        static var familyName: FieldKey { "familyName" }
        static var userName: FieldKey { "userName" }
    }
    
    //MARK:- fields
    @ID() var id: UUID?
    @Field(key: FieldKeys.email) var email: String
    @Field(key: FieldKeys.password) var password: String
    @Field(key: FieldKeys.appleId) var appleId: String?
    @Field(key: FieldKeys.givenName) var givenName: String?
    @Field(key: FieldKeys.familyName) var familyName: String?
    @Field(key: FieldKeys.userName) var userName: String?
    
    init() {}
    
    init(id: UserModel.IDValue? = nil,
         email: String,
         password: String,
         appleId: String? = nil,
         givenName: String? = nil,
         familyName: String? = nil,
         userName: String? = nil
    ) {
        self.id = id
        self.email = email
        self.password = password
        self.appleId = appleId
        self.givenName = givenName
        self.familyName = familyName
        self.userName = userName
    }
}

用户令牌模型

final class 用户令牌模型: Model {
    static let schema = "user_tokens"
    
    struct FieldKeys {
        static var value: FieldKey { "value" }
        static var userId: FieldKey { "user_id" }
    }
    
    //MARK:- fields
    
    @ID() var id: UUID?
    @Field(key: FieldKeys.value) var value: String
    @Parent(key: FieldKeys.userId) var user: UserModel
    
    init() {}
    init(
        id: 用户令牌模型.IDValue? = nil,
        value: String,
        userId: UserModel.IDValue
    ) {
        self.id = id
        self.value = value
        $user.id = userId
    }
}

推荐答案

您需要将代码更改为:

if let user = try await UserModel.query(on: req.db).filter(\.$email == request.email).first() {
    guard let userId = user.id
    else { throw SomeError() }
    //Compile Error: Operator function '==' requires that 'UUID' conform to 'QueryableProperty'
    let userToken = try await UserTokenModel.query(on: req.db)
    .filter(\.$user.$id == userId).first()
}

QueryableProperty错误是由于您没有将$放在过滤器左侧的id之前.如果您修复了这个问题,那么您将得到一个关于user.id属性为Optional的错误.引入guard可以修复这一问题,并允许您在用户不存在时处理错误.

Swift相关问答推荐

如何更新Square Order?

如何在向照片添加文本时定义文本对齐、文本背景的Alpha和在文本之前添加图像

如何在DATE()中进行比较

SWIFT`String.Encoding`:`.unicode`vs`.utf16`

如何异步返回视图?什么?

如何在SWIFT Memory中处理对VAR数组的更新(对COW感到困惑)

文件命名&NumberForMatter+扩展名&:含义?

如何在SwiftUI中做出适当的曲线?

在SwiftUI中绘制形状的路径后填充形状

为什么 XUIView 中的 Binding 看不到更新后的值?

获取具有关联类型的协议的self

如何在 SwiftUI 中将图像传递到 2 个视图

`let case(value)` 和 `case(let value)` 之间的区别 (Swift)

如何删除标签和步进按钮之间的间距是 SwiftUI Stepper?

在swift 3中将文件保存在文档目录中?

Swiftwhere数组扩展

subscribeOn 和 observeOn 的顺序重要吗?

如何更改弹出框的大小

Objective-C 方法与可选需求方法 Swift 冲突

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