0

我正在尝试在应用程序(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 像以前的版本一样允许自定义属性名称,那就容易多了。

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

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

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

4

1 回答 1

1

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

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

于 2020-06-25T12:13:01.730 回答