2016-06-28 6 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'}); 

のが、それは食事から取得する方法を知っていない - >食品。それはあなたがまだあなたの最初の文で定義されたmeal.idFoodを定義しますので、

db.meal.belongsTo(db.food, {foreignKey : '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

Excelent!これで私の望む結果が得られました。最後の質問です。 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

例を見てもわかりますが、例ではUserがTaskを、TaskがUserに属しているため、私の状況に該当する例はないと思います。しかし、私のケースでは、食事は食事に属しません。なぜなら、多くの食事は、同じ量の食べ物を異なる量(または異なるユーザー)で食べることができるからです。どのように私はそれを回避することができますか? – leofontes

+0

あなたの状況では、多対多の関係を実装する必要があります。食事には多くの食品があり、1つの食品は複数の食事で使用できるため、意味があります。この種の関係を実現するための文書に従ってください。 –

関連する問題