Vapor 4 如何通过外键过滤查询并解决QueryableProperty报错
问题原因
编译错误由查询键路径写法错误导致:
- 写法
\.$user.id访问的是@Parent关联下UserModel实例的普通存储属性id,类型为UUID?,不遵守Fluent框架要求的QueryableProperty协议,无法作为查询过滤的键路径使用。 @Parent关联对应的外键可查询属性,需要通过投影属性的$id访问,即键路径\.$user.$id,这才是Fluent识别的、指向user_id外键字段的合法查询属性。
正确实现代码
if let user = try await UserModel.query(on: req.db) .filter(\.$email == request.email) .first() { // 安全获取已存在用户的ID,避免强制解包的运行时风险 let userID = try user.requireID() // 使用合法的外键键路径做过滤 let userToken = try await UserTokenModel.query(on: req.db) .filter(\.$user.$id == userID) .first() }
注意事项
- Fluent查询使用的键路径每一层都必须是带
$前缀的投影属性,一旦访问到不带$的普通存储属性,就会触发QueryableProperty协议不匹配的编译错误。 requireID()是Fluent Model提供的安全方法,当模型已从数据库查询出来(id必然存在)时,调用该方法可以直接获取非可选的ID值,比强制解包更稳妥。
内容的提问来源于stack exchange,提问作者Shawn Baek
相关产品推荐
相关产品推荐

