2016-06-28 64 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在你的情況下,你需要實現多對多的關係,一餐可以有很多食物,一種食物可以用於多餐,所以這是有道理的。按照文檔來實現這種關係。 –