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
}
}
You need to change your code to:
The
QueryablePropertyerror is due to you not putting in the$in front of theidin the LHS of the filter. If you fixed this, you would then have got an error about theuser.idproperty beingOptional. Introducing the guard fixes this and allows you to handle the error if the user doesn't exist.