Sequelize hasMany加入协会

时间:2016-06-28 17:45:17

标签: node.js sqlite join sequelize.js relationships

我正在扩展我的应用程序,我需要加入我之前使用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属于给用户。但就我而言,食物并不属于膳食,因为许多膳食可以有不同数量的相同食物(或不同用户)。

2 个答案:

答案 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