我正在扩展我的应用程序,我需要加入我之前使用Sequelize创建的两个模型,它们如下:
膳食
sequelize.define('meal', {
mealId: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
quantity: {
type: DataTypes.DECIMAL,
allowNull: false
},
period: {
type: DataTypes.INTEGER,
allowNull: false
}
})
食品
sequelize.define('food', {
idFood: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
nameFood: {
type: DataTypes.STRING,
allowNull: false
}
})
我添加了以下关系:
db.food.hasMany(db.meal, {as : 'Food', foreignKey : 'idFood'});
此行在Meal
上添加了一个idFood列快速解释发生了什么,食物是一张包含面包,米饭,豆类等许多食物的餐桌。用餐是一张表格,用于识别用户选择的食物及其细节。
因此,我的理解是用餐有很多食物(正如我之前添加的那样),但食物并不需要任何关系用餐,因为它只保存数据,并且在我第一次填充后没有更改。但当我试图加入他们时:
db.meal.findAll({ include : [db.food] }).then(function (meals) {
console.log(JSON.stringify(meals));
});
我收到以下错误:
Unhandled rejection Error: food is not associated to meal!
任何人都可以解释我应该做什么吗?我认为这与关系有关,但我无法在文档中找到关于我应该做什么的任何好的解释。
谢谢!
编辑:阅读文档(again),这个例子很有意义,但我不认为这个例子适用于我的情况,因为在他们的例子中,User有一个Task,而Task属于给用户。但就我而言,食物并不属于膳食,因为许多膳食可以有不同数量的相同食物(或不同用户)。
答案 0 :(得分:15)
问题在于必须以两种方式定义关系。目前,Sequelize知道如何从Food - >因为
而用餐db.food.hasMany(db.meal, {as : 'Food', foreignKey : 'idFood'});
但它不知道如何从膳食中获取 - >餐饮。这就是为什么你必须以相反的方式定义相同的关系,如下所示:
db.meal.belongsTo(db.food, {foreignKey : 'idFood'});
这不会添加任何 new 键,因为它会定义您使用第一个语句定义的meal.idFood
。
现在你应该能够执行
了db.meal.findAll({ include : [db.food] }).then(function (meals) {
console.log(JSON.stringify(meals)); <-- each array element of meals should have an attribute `food`
});
答案 1 :(得分:1)
如果您在关联({ as: 'Food' }
)上使用别名,则还需要在include语句中使用它。
所以它就像那样:
db.meal.findAll({
include : [{
model: db.food,
as: 'Food'
}]
}).then(function (meals) {
console.log(JSON.stringify(meals));
});
如果关联是别名(使用as选项),则必须指定 包含模型时的别名。注意用户的工具如何作为上面的仪器别名。为了实现这一目标,您必须指定要加载的模型以及别名
更多信息here。