需要 ID 属性名称的 Vapor 4 关系和模型

Posted

技术标签:

【中文标题】需要 ID 属性名称的 Vapor 4 关系和模型【英文标题】:Vapor 4 Relationships and Models requiring an ID property name 【发布时间】:2020-06-17 04:30:15 【问题描述】:

我正在尝试在应用程序 (Vapor 4) 中设置父级,尽管它可以实现,但我遇到了这个问题,或者至少是一个限制,导致在模型中使用的属性名称不太有意义。

Vapor 4 要求将 @ID 属性命名为“id”(var id: ...),而在之前的版本中,属性名称是可定义的,因此名称更有意义。

例如 User 表:我们的用户数据使用 Username 作为唯一键(不是主键),因此 User 模型定义如下:

  // 'Unique key for the record.'
  @ID(custom: "sysid", generatedBy: .database)
  var id: Int?

  // Unique login name 
  @Field(key: "username")
  var username: String?

  // Password for this login.
  @Field(key: "password")
  var password: String
  ...

有意义且可读,并且在应用程序中使用模型的任何地方,开发人员都知道 Id 字段是 sysid 而用户名是用户名。

规则和配置文件表中的外键使用用户名作为外键(由于遗留原因)。改变它虽然是数据库和应用程序目前是不可能的。

自从最初的实现以来,我一直在阅读并意识到使用关系(而不是过滤器和连接)的好处。

要在 Vapor 4 中使用关系,我必须将模型定义更改为:

  // 'Unique key for the record.'
  @Field(key: "sysid")
  var sysid: Int?

  // Unique login name 
  @ID(key: "username")
  var id: String?

  // Password for this login.
  @Field(key: "password")
  var password: String
  ...

我的模型定义意义不大(尽管它确实有效):

当然,这意味着尽管代码 .username 现在需要更改为 .id,但它的自解释性要差得多。

在 Vapor 3 中,我们可以将 ID 属性名称定义为任何内容。如果 Fluent/Vapor 4 像以前的版本一样允许自定义属性名称会容易得多。

我想知道是否有人遇到过这个“问题”?或者有一个解决方法,允许模型继续使用有意义的名称,并且仍然允许 Parenting 正常工作。

我以这个简单的用户数据为例,但肯定其他人使用了不同/有意义的列名,这让我很烦恼?

任何指导/想法将不胜感激谢谢

【问题讨论】:

【参考方案1】:

Fluent 的关系属性包装器都是基于在id 属性下定义的关系。这允许您创建一个仅具有父 ID 的子代,而无需先在数据库中查找父代等。

如果您想使用 ID 以外的其他内容,您需要手动执行查询(对于父/子来说相对简单)或复制属性包装器并选择不同的属性。

【讨论】:

我已经决定自己编写自己的 Property Wrapper,它 90% 都在工作,但是我无法让急切加载从父级中提取正确的字段。但这只是时间问题。感谢您的回答。

以上是关于需要 ID 属性名称的 Vapor 4 关系和模型的主要内容,如果未能解决你的问题,请参考以下文章

在外键关系上显示名称属性

如何将关系子项包装到 Vapor 中的数组中?

关系模型

权限模型

Laravel 4 Eloquent 获取关系 ID

如何对 Vapor DB 对象进行单元测试