4

Sequelize ではこれが本当に欠けています。.hasMany 定義は、ID のマッピングのみで機能します。通常のプロジェクト/タスクの簡単な例を見てみましょう。次に、プロジェクトに VERSION 属性があり、同じ VERSION 属性を持つタスクに関連付ける必要があるとします。

ID と VERSION という 2 つの属性に基づく関係を強制する方法が必要です。

複数の外部キー (複合キーと呼ばれる) に基づいて関連付けを行う方法が必要であると強く信じています。

私のプロジェクトでは、複数のキーを使用して getTasks に代わるものを提供するために、モデルに一連のメソッドを追加する必要がありました。

誰かが提案を持っているなら、彼は大歓迎です。

4

1 に答える 1

5

これは、私たちのプロジェクトでも必要だったものです。必要な機能を追加し、プロジェクトで毎日使用していますが、機能は完全にはテストされていないため、まだプル リクエストを送信していません。

ただし、 https://github.com/innofluence/sequelize/tree/newedgeでコードを見つけることができます

specs/associations/composite-key.spec.jsAPI を示します。

Article = sequelize.define('Article', {
  'title': Sequelize.STRING
}, {
  instanceMethods: {
    item_key: 'article'
  }        
});

Label = sequelize.define('Label', {
  'text': Sequelize.STRING
})

Label.hasMany(Article, {foreignKey: "label_id", joinTableName: "item_label" });
Article.hasMany(Label, {foreignKey:{ "item_id": "id", "item": "item_key" }, joinTableName: "item_label" });

この例では、記事に複数のラベルを付けることができます。結合テーブル ( item_label) には次の行があります: id, item, item_id, label_id。ここで重要なのは、Label と Article の間のリンクが複合キーであることを示す最後の行です。外部キーは、キーが結合テーブルの行であり、値がアーティクル行の値であるマップとして与えられます。ここで、item_label 内のアイテムが item_key にマップされていることがわかります。これは、article のインスタンス メソッドです。これは、すべての記事にキー記事があるため、それをデータベースに保存する必要がないためです。

これがお役に立てば幸いです。まだ疑問がある場合は、お気軽に続編モデルのコードを投稿してください。私がお手伝いします :-)

于 2012-12-11T19:55:20.560 に答える