用外键定义关联

时间:2012-12-06 20:33:32

标签: sequelize.js

我真的在Sequelize中错过了这个。 .hasMany定义仅适用于ID的映射。 让我们以通常的项目/任务为例。接着说,项目具有VERSION属性,并且应该与具有相同VERSION属性的任务相关联。

我需要一种方法来强制关系基于两个属性:ID和VERSION。

我坚信我们需要一种基于多个外键(称为复合键)进行关联的方法

在我的项目中,我不得不向模型添加一堆方法,以使用多个键替代getTasks。

如果有人有建议,欢迎他。

1 个答案:

答案 0 :(得分:5)

这也是我们项目中需要的东西。我们已添加了我们所需的功能,并且每天都在我们的项目中使用它,但功能未经过全面测试,因此我们尚未提交拉取请求。

然而,您可以在https://github.com/innofluence/sequelize/tree/newedge

找到代码

specs/associations/composite-key.spec.js显示API:

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,这是文章的实例方法。这是因为所有文章都有关键文章,因此无需将其保存在数据库中。

我希望这会有所帮助,如果您仍然有疑问,请随时发布您的续集模型代码,我会尽力帮助: - )