javascript - 用联结表续集自我关系
问题描述
我想建立一个代表 : 的续集关系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'
,这是真的,但我不知道如何指定正确的键/列。
任何帮助,请!
解决方案
我看到几个问题:首先,您在成分模型中执行 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"})
推荐阅读
- android - ConstraintSet 不会改变任何东西
- python - 如何在我的列表中的浮点数末尾添加后缀(如测量单位 cm、m、km 等)?
- nginx - 仅从非 www 重定向到 www 不起作用,www 和 non-www 都在 nginx 上工作
- javascript - 手动拉动智能手机中的键盘
- scala - 原因:MatchError: [Ljava.lang.String;@21a536b1 (of class [Ljava.lang.String;) in join 2 Dataframe
- ios - 动态隐藏状态栏时如何保留状态栏占用的空间?
- google-cloud-platform - client_disconnected_after_partial_response 从本地 ISP 之一访问负载平衡
- node.js - 如何解决部署节点应用程序问题
- javascript - 每次我更新 js 文件行为时,nodemon 包都会引发错误:“[nodemon] 应用程序崩溃 - 等待文件更改后再启动”
- python - 如何将 Python 中的图像数组(枕头对象)上传到 Google Cloud