首页 > 解决方案 > 用联结表续集自我关系

问题描述

我想建立一个代表 : 的续集关系An item is composed by a specific amount of others items

数据库表

Item (itemId, name)
Ingredient (ingredientId, itemParentId, itemChildrenId, amount)

续集模型

// Item.js
class Item extends Sequelize.Model { }
Item.init({
  itemId: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  name: Sequelize.STRING,
}, {
  sequelize: db,
})

// Ingredient.js
class Ingredient extends Sequelize.Model { }
Ingredient.init({
  ingredientId: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  amount: Sequelize.INTEGER,
}, {
  sequelize: db,
})

我只是想编写正确的续集关联以匹配我的数据库逻辑,所以我尝试了:

// Association.js
Item.belongsToMany(Item, { through: Ingredient, as: 'ingredients', foreignKey: 'itemParentId' })

但是我遇到了这个错误Unknown column 'ingredients->ingredient.ingredientItemId' in 'field list',这是真的,但我不知道如何指定正确的键/列。

任何帮助,请!

标签: javascriptnode.jssequelize.js

解决方案


我看到几个问题:首先,您在成分模型中执行 Item.init。可能是你的一个错误。将其更改为 Ingredient.init。(我个人从未使用过这个“init” api,我以不同的方式定义模型,所以我不确定它是如何工作的)

其次,将 Ingredient 和 Item 的主键更改为“id”,例如:

id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true
  }

此外,您的关联不正确,它需要通过联结表:

Item.belongsToMany(Ingredient, { through: "ItemIngredient"})

请注意,“通过”在这里指的是一个表名,如果您使用 model.sync(),Sequelize 将自动创建它,如果不是 - 您将需要自己创建它(或使用迁移,我推荐),包含列:itemId、componentId。

您还需要添加“反向”关联,如下所示:

Ingredient.belongsToMany(Item, { through: "ItemIngredient"})

推荐阅读