我正在尝试在应用程序(Vapor 4)中设置育儿功能,虽然这是可以实现的,但我遇到了这个问题,或者至少遇到了一个限制,导致模型中使用的属性名称意义较小。
Vapor 4要求将@ID属性命名为'id‘(var id:...),而在以前的版本中,属性名称是可定义的,因此更有意义。
例如,用户表:我们的用户数据使用用户名作为唯一键(不是主键),因此用户模型是这样定义的:
// '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像以前的版本一样允许自定义属性名称,事情会容易得多。
我想知道是否有人遇到过这个“问题”?或者有一个解决办法,允许模型继续使用有意义的名称,同时仍然允许为人父母的工作正常进行。
我使用了这个简单的用户数据作为示例,但其他人肯定会使用不同的/有意义的列名,这会导致我的..烦人?
如有任何指导或想法,将不胜感激
发布于 2020-06-25 12:13:02
Fluent的relationship属性包装器都基于在id
属性下定义的关系。这允许您只使用父ID创建子ID,而不必首先在DB中查找父ID,等等。
如果您想使用ID以外的其他东西,则需要手动执行查询(对于父级/子级相对简单),或者复制属性包装器并选择不同的属性。
https://stackoverflow.com/questions/62421519
复制