2016-06-28 68 views
5

我扩大我的申请,我需要加入我之前曾与Sequelize创建了两个型号,它们分别为:Sequelize的hasMany加入协会

膳食

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'}); 

此行膳食增加了一个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),这个例子是有道理的,但我不认为这个例子适用于我的情况,因为在他们的例子中,用户有一个任务,任务属于用户。但在我的情况下,食物不属于膳食,因为许多膳食可以有不同数量(或不同用户)的相同食物。

回答

6

问题是关系必须被定义为两种方式。目前,Sequelize知道如何从食物 - >膳食因为

db.food.hasMany(db.meal, {as : 'Food', foreignKey : 'idFood'}); 

但它不知道如何从膳食 - >食物。这就是为什么你必须倒过来定义相同的关系,就像这样:

db.meal.belongsTo(db.food, {foreignKey : 'idFood'}); 

这不添加任何键,因为这将确定哪些你与你的第一条语句已经定义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` 
}); 
+0

优秀!这给了我想要的结果,只是最后一个问题。 我在打印JSON.stringify(餐食),它显示了数据的每个部分,但是如果我想自己访问其中的一些值,怎么办?我能做到吗? – leofontes

+0

像访问每个食物? –

+0

没关系,我明白了,非常感谢你! – leofontes

0

如果您在关联上使用别名({ as: 'Food' }),则还需要在include语句中使用它。

所以它会是这样的:

db.meal.findAll({ 
    include : [{ 
    model: db.food, 
    as: 'Food' 
    }] 
}).then(function (meals) { 
    console.log(JSON.stringify(meals)); 
}); 

If an association is aliased (using the as option), you must specify this alias when including the model. Notice how the user's Tools are aliased as Instruments above. In order to get that right you have to specify the model you want to load, as well as the alias

更多信息here

+0

仍然给我的错误: 未处理的废品:食物(食品)没有关联到一顿! – leofontes

+0

阅读文档(再次),这个例子是有道理的,但我认为这个例子并不适用于我的情况,因为在他们的例子中,用户有一个任务,任务属于用户。但在我的情况下,食物不属于膳食,因为许多膳食可以有不同数量(或不同用户)的相同食物。我该如何解决这个问题? – leofontes

+0

@leofontes在你的情况下,你需要实现多对多的关系,一餐可以有很多食物,一种食物可以用于多餐,所以这是有道理的。按照文档来实现这种关系。 –