2017-03-02 53 views
0

我有以下四種型號續集關聯:與多個表相同的字段是可能的?

用戶

user_id 
user_email 

許可證

permit_id 
permit_name 

標籤

label_id 
label_name 
module_name (user or permit) 

ModuleLabel

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

我怎樣才能映射標籤的詳細信息,而使用sequelize獲取許可數據?

「從」允許選擇,加入ModuleLabel這裏是模塊= permit_id & & MODULE_NAME =「許可證」(從標籤表),然後從那裏

+0

是這些表之間有任何外鍵關係嗎? –

+0

@AtulAgrawal:更新問題 – Kepler

+0

這裏有什麼進展? – piotrbienias

回答

0

加入標籤從你的描述,似乎你試圖選擇「從」Permit,加入ModuleLabel其中module_id=permit_id,然後從那裏加入Label。如果這不正確,請澄清這個問題。

如果是這樣的話,通過設置hasMany關係,您想要做的事絕對有可能。但是,我建議不要像這樣以一般方式重新使用關鍵字段(其中module_id可能是許可證或用戶ID)。我個人花了很多時間在Drupal中使用原始實體表,它們也做了同樣的事情 - 一個ID可以映射到任意數量的外部表,並且您必須評估每個記錄的類型以知道要加入哪個表。它造成了非常混亂和大量的查詢,並且如果某些東西被破壞,會很困惑地進行調試。 (容易出錯)

+0

已更新的問題 從「允許,加入ModuleLabel,其中module_id = permit_id && module_name ='permit'(來自標籤表格)」中選擇「,然後從那裏加入標籤」 – Kepler

0

它可以做到,但絕對沒有限制在數據庫中。在您的情況下,ModuleLabel中的module_id字段可能會引用userpermit表。我可以向你展示一些實現草圖,但是我會建議重構模式,例如創建UserLabelPermitLabel型號,其外部約束條件爲UserPermit。但是,下面是你如何做你的方式

// 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 }); 
    } 
} 

以上的關聯使我們能夠查詢兩個UserPermit時加入ModuleLabel模型。最重要的部分是記住防止創建數據庫約束的constraints: false。讓我們繼續。 Label模型不需要任何關聯,只有字段聲明。最後一個模型是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 }); 
    } 
} 

現在,爲了執行所需的查詢,你可以做到這一點

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

上面的查詢會生成SQL類似這樣的介紹如下

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'; 
相關問題