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 であり、ユーザー名がユーザー名であることを認識しています。

Rule and Profile テーブルの外部キーは、ユーザー名を外部キーとして使用します (従来の理由により)。データベースとアプリを変更することは現在不可能です。

最初の実装以来、私は (フィルターと結合ではなく) リレーションシップを使用することの利点を読み、実現してきました。

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