2017-03-02 48 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'; 
相关问题