I have two models (UserModel and UserTokenModel)
UserTokenModel has a ForeignKey that indicates UserModel.
Here is my code. I tried to filter by userModel's Id on UserTokenModel but I got an error.
Operator function '==' requires that 'UUID' conform to 'QueryableProperty'
if let user = try await UserModel.query(on: req.db).filter(\.$email == request.email).first() {
//Compile Error: Operator function '==' requires that 'UUID' conform to 'QueryableProperty'
let userToken = try await UserTokenModel.query(on: req.db)
.filter(\.$user.id == user.$id).first()
}
Here is definition of Models
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
}
}
UserTokenModel
final class UserTokenModel: 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: UserTokenModel.IDValue? = nil,
value: String,
userId: UserModel.IDValue
) {
self.id = id
self.value = value
$user.id = userId
}
}
CodePudding user response:
You need to change your code to:
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()
}
The QueryableProperty
error is due to you not putting in the $
in front of the id
in the LHS of the filter. If you fixed this, you would then have got an error about the user.id
property being Optional
. Introducing the guard fixes this and allows you to handle the error if the user doesn't exist.