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

Vapor 4 Relationships and Models requiring an ID property name

我正在尝试在应用程序 (Vapor 4) 中设置育儿方式,虽然它是可以实现的,但我有 运行 跨过这个问题或者至少是导致名称意义不大的限制 属性在模型中使用。

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

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

  // '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,用户名是用户名。

规则和配置文件中的外键 table 使用用户名作为外键(由于遗留原因)。要更改它,尽管目前无法使用数据库和应用程序。

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

要在 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 允许自定义 属性 名称,就像以前的版本一样,那会容易得多。

我想知道是否有人遇到过这个 'issue?' 或有解决方法来允许模型继续使用有意义的名称并仍然允许育儿正常工作。

我使用这个简单的用户数据作为示例,但肯定其他人使用 different/meaningful 列名称让我.. 烦恼?

任何 guidance/thoughts 将不胜感激谢谢

Fluent 的关系 属性 包装器全部基于 id 属性 下定义的关系。这使您可以创建仅具有父 ID 的子代,而无需先在数据库中查找父代等。

如果您想使用 ID 以外的东西,您需要手动执行查询(对于 parent/child 来说相对简单)或复制 属性 包装器并选择一个不同的 属性.