Vapor 4 Fluent ORM排序功能无法正常使用求助
Vapor 4 关联模型排序问题解决
你的代码移除排序逻辑后可正常查询,但尝试通过关联的IdeaMeritScoreMetric模型的meritScore字段排序时出现两种错误:
- 使用
.sort(\.$ideaMeritScoreMetric.meritScore, .descending)时,报错:无法从上下文推断键路径类型;请考虑显式指定根类型 - 改为
.sort(\Idea.$ideaMeritScoreMetric.meritScore, .descending)时,报错:类型'OptionalChildProperty<Idea, IdeaMeritScoreMetric>'没有成员'meritScore'
问题原因
\.$ideaMeritScoreMetric是OptionalChildProperty类型,它代表的是Idea与IdeaMeritScoreMetric之间的关联关系,而非关联模型本身,因此无法直接通过它访问meritScore属性。另外,.with(\.$ideaMeritScoreMetric)仅用于预加载关联数据,不会将关联表加入查询的JOIN逻辑,所以无法直接基于关联字段排序。
解决方案
需要先将关联的IdeaMeritScoreMetric表JOIN到查询中,再直接使用该模型的meritScore字段排序:
修改后的完整函数代码:
func getTopIdeas(req: Request) throws -> EventLoopFuture<[Idea]> { guard let civicConcernID = req.parameters.get("civicConcernID", as: UUID.self) else { throw Abort(.badRequest, reason: "Missing civicConcernID parameter.") } let numberOfTopIdeas = 10 return Idea.query(on: req.db) .join(\Idea.$ideaMeritScoreMetric, method: .inner) // JOIN关联表 .with(\.$ideaMeritScoreMetric) // 保持预加载关联数据 .filter(\.$civicConcern.$id == civicConcernID) .sort(IdeaMeritScoreMetric.$meritScore, .descending) // 直接使用关联模型的字段排序 .range(..<numberOfTopIdeas) .all() }
补充说明
- 如果你的关联是可选的,担心存在Idea没有对应IdeaMeritScoreMetric记录的情况,可以将JOIN方法改为
.left,避免过滤掉无关联数据的Idea:.join(\Idea.$ideaMeritScoreMetric, method: .left) - 确保
IdeaMeritScoreMetric模型中正确定义了meritScore字段的自动生成Key Path(即$meritScore)。
内容的提问来源于stack exchange,提问作者Harry Flotemersch
相关产品推荐
相关产品推荐

