如何在Fluent/Vapor中正确获取不带关联子模型的简化User模型?
结论
- 你不需要创建不包含products属性的独立模型
- 你当前写的参考代码已经是最简单的实现方案
原理说明
Fluent 中的关联属性(比如你用来实现一对多关系、用@Children属性包装器修饰的products)默认是懒加载的,只有你在查询时显式调用with(\.$products)方法,Fluent才会执行关联查询拉取对应的子模型数据、填充该属性。
你现有代码没有加with调用,执行时只会查询用户表的基础字段,不会访问products表,返回的User实例里的products属性处于未加载状态,只要你不主动访问这个属性,就不会产生额外的数据库查询,完全满足你只需要用户列表的场景。
序列化问题优化(可选)
如果你要把User实例序列化返回给前端,担心未加载的products属性会导致序列化报错,只需要额外定义一个仅包含需返回字段的响应结构体即可,不需要修改原User模型的数据库映射逻辑,示例如下:
// 仅包含需要对外暴露的用户字段 struct UserListResponse: Content { let id: UUID? let username: String let email: String // 其他你需要的用户基础字段,无需声明products } func getAllUsersHandler(_ request: Request) -> EventLoopFuture<[UserListResponse]> { User.query(on: request.db).all() .map { users in users.map { user in UserListResponse( id: user.id, username: user.username, email: user.email ) } } }
内容的提问来源于stack exchange,提问作者KrzysiekS
相关产品推荐
相关产品推荐

