Vapor 4:如何将急切加载的父关系映射为不同的格式?

2023-12-04

我在如何返回包含父关系的模型,同时将急切加载的模型映射到不同的形式方面遇到了一些困难。

让我们考虑以下 2 个模型:Course and User.

final class Course: Model, Content {
  static let schema = "courses"

  @ID(key: .id)
  var id: UUID?

  @Field(key: "name")
  var name: String

  @Parent(key: "teacher_id")
  var teacher: User

  init() { }
}

final class User: Model, Content {
  static let schema = "users"

  @ID(key: .id)
  var id: UUID?

  @OptionalField(key: "avatar")
  var avatar: String?

  @Field(key: "name")
  var name: String

  @Field(key: "private")
  var somePrivateField: String

  init() { }
}

我有一条这样的路线,它返回一系列课程:

func list(req: Request) throws -> EventLoopFuture<[Course]> {
  return Course
    .query(on: req.db)
    .all()
}

生成的 JSON 看起来像这样:

[
  {
    "id": 1,
    "name": "Course 1",
    "teacher": {
      "id": 1
    }
]

我想要的是返回教师对象,这很容易通过添加.with(\.$teacher)到查询。 Vapor 4 确实让这一切变得非常简单!

[
  {
    "id": 1,
    "name": "Course 1",
    "teacher": {
      "id": 1,
      "name": "User 1",
      "avatar": "https://www.example.com/avatar.jpg",
      "somePrivateField": "super secret internal info"
    }
]

这就是我的问题:整个User返回对象,实际上包含所有字段,甚至是我不想公开的字段。

将教师信息转换为不同版本的最简单方法是什么User模型,比如PublicUser?这是否意味着我必须为Course,映射我的数组[Course] to [PublicCourse],复制所有属性,使它们在Course型号变更等?

这看起来像是很多样板,将来有很大的出错空间。很想听听是否有更好的选择。


您可以通过首先对原始模型进行编码,然后将其解码为具有较少字段的结构来实现此目的。所以,对于一个例子Course存储在course转换为PublicCourse你会这样做:

struct PublicCourse: Decodable {
    //...
    let teacher: PublicUser
    //...
}

let course:Course = // result of Course.query including `with(\.$teacher)`
let encoder = JSONEncoder()
let decoder = JSONDecoder()
let data = try encoder.encode(course)
let publicCourse = try decoder.decode(PublicCourse.self, from: data)

注意PublicUser结构中的字段。如果这是精简版本,您可以一次性生成最小的 JSON。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vapor 4:如何将急切加载的父关系映射为不同的格式? 的相关文章

随机推荐

  • 复杂的数据库操作

    我为我的 ASP NET 应用程序绘制了一个非常简单的数据库设计 在一些帮助下 我成功地实现了我的设计 但我想将数据插入到该表中并从中检索 我的应用程序中一个非常重要的功能将需要某个记录的所有 7 个表中的所有信息 有时我需要让我的应用程序
  • HttpClient GetAsync 未按预期工作

    当使用 Postman 测试我的 Web API 时 我的 API 执行得很好 当涉及到运行代码时HttpClient在我的客户端应用程序中 代码执行时没有错误 但在服务器上没有预期的结果 可能会发生什么 从我的客户端应用程序 privat
  • 传递 SqlConnection

    我创建了一个 TransactionScope 并在该范围内在数据库中创建和更新了各种项目 在此过程中 我对数据库进行了大量调用 最初 我在 TransactionScope 的开头打开了一个 SqlConnection 并将其传递给任何进
  • SwiftUI hidesBottomBarWhenPushed 等效吗?

    我试图隐藏我的TabView当我在我的视图中推送一个新视图时NavigationView但目前看来没有办法做到这一点 我在互联网上看到了很多东西 但似乎没有什么适合我 默认情况下 我的代码如下所示 struct ContentView Vi
  • C# 中的哈希密码和盐密码

    我刚刚浏览了 DavidHayden 的一篇文章对用户密码进行哈希处理 真的 我无法得到他想要达到的目标 这是他的代码 private static string CreateSalt int size Generate a cryptog
  • 使用 maltpoltlib 对带有轮廓的 pcolormesh 进行动画处理

    我正在做一些事情 我需要可视化时间和表面上的进展 比如说热量 我在使用轮廓对 pcolormesh 进行动画处理时遇到一些麻烦 轮廓确实是动画的 但 pcolormesh 不是 我只得到第一个从未被替换的 我的代码很像这样 x y and
  • 使用 Javascript 从 Web 应用程序访问设备指南针

    是否可以通过网络应用程序在 iPhone Android 设备上使用 Javascript 访问指南针 已经在网上找了好几个小时了 我知道你可以通过以下方式访问加速度计 window ondevicemotion 函数 事件 有谁知道是否可
  • 在VS2019中连接Entity Framework与MYSQL

    我刚刚安装了 Visual Studio 2019 并尝试添加具有 ADO NET 实体模型的数据库 但向导在此步骤中崩溃了 选择实体框架版本 我有 Visual Studio Community 2019 v16 4 5安装 MySQL
  • 列表项项目符号重叠

    我有一个无序列表 我希望将其列表项显示为两行多列 问题在于每个列表项的项目符号与前一个列表项重叠 我该如何阻止这种情况发生 我已经找到了一个调整边距的混乱解决方案 但想知道是否有一个优雅的解决方案 我想保留子弹 我不希望列表项中的文本环绕项
  • 使用 cURL 编辑 GIST

    bin bash COMMIT git log 1 pretty format subject s name xxx date cD curl X PATCH d files latest commit content COMMIT u u
  • 如何将 Cassandra 的本地节点复制到其他 Cassandra 的远程节点?

    我需要使用 SimpleStrategy 将本地节点复制到其他 Cassandra 数据库中的远程节点 有人知道我从哪里开始吗 如果您要将数据写入两个集群 那么这里的主要复杂性是如何避免覆盖在本地设置之后在云中更改的数据 有几种可能性可以做
  • 如何在“电话:”链接中提供拨打分机号的选项?

    将电话链接设置为 a href Dial a 从移动浏览器中单击它 只有初始号码会传输到拨号器 而不是逗号或扩展名 我试过了p w and ext 也一样 但没有任何作用 p and w分别更改为 7 和 9 使用 Moto X 第一代进行
  • python中小于负无穷大的数字? [复制]

    这个问题在这里已经有答案了 这在 python2 中是可能的 None lt float inf 还有 它always returns True 然而 在 python3 上 这会抛出 TypeError unorderable types
  • 为多个用户主动安装/推送团队中的应用程序

    我有一个关于如何在 Teams 中为多个用户主动安装 推送应用程序 的疑问 我们已将 Bot 应用程序添加为 Teams 应用程序目录的一部分 并且我按照以下有关 Microsoft Teams 中的管理应用程序设置策略的文档来安装应用程序
  • 地图和法律提及

    在 iOS 我的问题是我必须向我的地图添加页脚子视图 它将隐藏合法链接 如何解决这个问题而不被 App Store 拒绝 我可以自己创建另一个合法按钮并将其添加到地图视图中我想要的位置吗 我不知道我能做什么 有一些答案建议您将合法标签移至v
  • Html.Partial 与 Html.RenderPartial 和 Html.Action 与 Html.RenderAction

    在 ASP NET MVC 中 有什么区别 Html Partial and Html RenderPartial Html Action and Html RenderAction Html Partial返回一个字符串 Html Ren
  • 当前上下文中不存在名称“ViewBag”

    我正在尝试在我的应用程序中使用 ViewBag 我拥有所有最近的 dll 最新版本的 MVC 3 但我仍然收到错误 名称 ViewBag 在当前上下文中不存在 我什至卸载并重新安装了 MVC 3 但没有任何变化 另外 我不相信 dll 会出
  • 通过 Gmail 发送电子邮件

    我有一个代码 用于发送电子邮件 Intent i new Intent Intent ACTION SEND i setType text plain i putExtra Intent EXTRA EMAIL new String to
  • 计算中使用的提示或宏变量

    我使用 EG 中的提示管理器创建了一个数字变量 该变量称为 HYr 代表我提取的数据最高年份 运行程序时 我根据最高年份创建了 4 个新变量 这就是我遇到问题的地方 我有以下内容 Let Yr2 HYr 1 Let Yr3 HYr 2 Le
  • Vapor 4:如何将急切加载的父关系映射为不同的格式?

    我在如何返回包含父关系的模型 同时将急切加载的模型映射到不同的形式方面遇到了一些困难 让我们考虑以下 2 个模型 Course and User final class Course Model Content static let sch