4

我在 Sequelize 中真的很想念这个。.hasMany 定义仅适用于 ID 上的映射。让我们以通常的项目/任务简单示例为例。让我们说一个项目有一个 VERSION 属性,并且应该与具有相同 VERSION 属性的任务相关联。

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

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

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

如果有人有建议,他是受欢迎的。

4

1 回答 1

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 映射到 item_key,这是 article 上的实例方法。这是因为所有文章都有key文章,所以不需要保存在db中。

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

于 2012-12-11T19:55:20.560 回答