2017-03-02 18 views
0

I持って、次の4つのモデルSequelize Association:複数のテーブルを持つ同じフィールドが可能ですか?

ユーザー

user_id 
user_email 

許可

permit_id 
permit_name 

ラベル

label_id 
label_name 
module_name (user or permit) 
sequelizeを使用して許可データをフェッチしながら、私はラベルの詳細をマッピングし得ることができる方法

ModuleLabel

module_label_id 
label_id **(fk - Label table)** 
module_id (user_id or permit_id) 

許可「から」を選択し、ModuleLabel(ラベルテーブルから)MODULE_ID = permit_id & &モジュール名=「許可」を参加し、その後、あなたがしているようだあなたの説明から、そこ

+0

である以下に示す次のようなSQLを生成し、ご希望のクエリを実行するために、クエリの上、この

models.Permit.findAll({ include: [ { model: models.ModuleLabel, include: [ { model: models.Label, where: { module_name: 'permit' } } ] } ] }).then((result) => { console.log(result); }); 

を行うことができ、今ModuleLabel

// in ModuleLabel model definition classMethods: { associate: function(models){ this.belongsTo(models.Label, { foreignKey: 'label_id' }); this.belongsTo(models.User, { foreignKey: 'module_id', constraints: false }); this.belongsTo(models.Permit, { foreignKey: 'module_id', constraints: false }); } } 

ですこれらのテーブル間に外部キー関係がありますか? –

+0

@AtulAgrawal:更新された質問 – Kepler

+0

ここで進歩がありますか? – piotrbienias

答えて

0

からラベルに参加「から」Permitを選択しようとすると、ModuleLabelに接続します。ここでは、module_id=permit_idとなり、そこからLabelに参加します。それが正しくない場合は、質問を明確にしてください。

この場合、hasManyの関係を設定することで、あなたがしたいことは絶対に可能です。しかし、このような一般的な方法でキーフィールドを再利用することはお勧めしません(module_idは許可IDまたはユーザーIDのどちらでもかまいません)。私は個人的に、同じことをするDrupalの生のEntityテーブルを使って多くの時間を費やしました。IDは任意の数の外部テーブルにマップでき、各レコードのタイプを評価してどのレコードを結合するかを知る必要がありました。それは非常に面倒で大きなクエリのために作られ、何かが壊れた場合に急いでデバッグするのは混乱していました。 (そして簡単に間違いをすることがあります)

+0

質問が更新されました 「許可」から「選択」を選択し、ModuleLidをmodule_id = permit_id && module_name = '許可'(Labelテーブルから) – Kepler

0

データベースには制約はありませんが、間違いなく実行できます。あなたの場合、ModuleLabelmodule_idフィールドはuserまたはpermitテーブルを参照することがあります。私はあなたにいくつかの実装スケッチを示すことができますが、私はスキーマを再構築することを提案します。外部キー制約がUserおよびPermitになるUserLabelおよびPermitLabelモデルを作成します。ただし、以下は関連がUserまたはPermit両方を照会するとき、私たちはModuleLabelモデルに参加できるようにする上、あなたはそれをあなたの方法

// in User model definition 
classMethods: { 
    associate: function(models){ 
     this.hasMany(models.ModuleLabel, { foreignKey: 'module_id', constraints: false }); 
    } 
} 

// in Permit model definition 
classMethods: { 
    associate: function(models){ 
     this.hasMany(models.ModuleLabel, { foreignKey: 'module_id', constraints: false }); 
    } 
} 

を行うことができる方法です。最も重要な部分は、データベース制約の作成を妨げるconstraints: falseについて覚えておくことです。次へ移りましょう。 Labelモデルには関連付けは必要なく、フィールド宣言のみが必要です。最後のモデルは

SELECT * FROM Permits 
LEFT OUTER JOIN ModuleLabels 
ON Permits.id = ModuleLabels.module_id 
INNER JOIN Labels 
ON ModuleLabels.label_id = Labels.id 
AND Label.module_name = 'permit'; 
関連する問題