它可以做到,但絕對沒有限制在數據庫中。在您的情況下,ModuleLabel
中的module_id
字段可能會引用user
或permit
表。我可以向你展示一些實現草圖,但是我會建議重構模式,例如創建UserLabel
和PermitLabel
型號,其外部約束條件爲User
和Permit
。但是,下面是你如何做你的方式
// 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 });
}
}
以上的關聯使我們能夠查詢兩個User
或Permit
時加入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';
是這些表之間有任何外鍵關係嗎? –
@AtulAgrawal:更新問題 – Kepler
這裏有什麼進展? – piotrbienias