2016-06-28 10 views
5

ich meine Bewerbung bin erweitern und ich brauche zwei Modelle anschließen ich vorher mit Sequelize geschaffen hatte, sie sind wie folgt:Sequelize hasMany Join Verein

Meal

sequelize.define('meal', { 
    mealId: { 
     type: DataTypes.INTEGER, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    quantity: { 
     type: DataTypes.DECIMAL, 
     allowNull: false 
    }, 
    period: { 
     type: DataTypes.INTEGER, 
     allowNull: false 
    } 
}) 

Lebensmittel

sequelize.define('food', { 
    idFood: { 
     type: DataTypes.INTEGER, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    nameFood: { 
     type: DataTypes.STRING, 
     allowNull: false 
    } 
}) 

Ich fügte die folgende Beziehung hinzu:

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

Diese Linie eine idFood Spalte Mahlzeit fügt

schnell zu erklären, was los ist, Essen eine Tabelle mit vielen Lebensmitteln ist (duh) wie Brot, Reis, Bohnen, usw. Mahlzeit ist eine Tabelle, die angibt, welches Essen der Benutzer mit seinen Details gewählt hat.

Daher mein Verständnis war, dass Mahlzeit viele Essen hatte (wie ich vorher hinzugefügt), aber Lebensmittel benötigte keine Beziehung mit Mahlzeit, da es Daten nur hält und nicht verändert wird nach Ich bevölkere es zuerst. Aber als ich versuchte, sie zu verbinden mit:

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

Ich habe folgende Fehlermeldung:

Unhandled rejection Error: food is not associated to meal! 

Kann mir jemand erklären, was soll ich tun? Ich denke, es hat mit den Beziehungen zu tun, aber ich konnte in der Dokumentation keine gute Erklärung finden, was ich tun sollte.

Vielen Dank!

Bearbeiten: Lesen der Dokumentation (again), das Beispiel ist sinnvoll, aber ich denke nicht, dass das Beispiel auf meine Situation anwendbar ist, weil in ihrem Beispiel Benutzer eine Aufgabe hat und Aufgabe zu Benutzer gehört. Aber in meinem Fall gehört Essen nicht zu einer Mahlzeit, weil viele Mahlzeiten dasselbe Essen in verschiedenen Mengen (oder für verschiedene Benutzer) haben können.

Antwort

6

Das Problem ist, dass die Beziehung in beide Richtungen definiert werden muss. Derzeit Sequelize weiß, wie man aus der Nahrung zu bekommen -> Essen wegen

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

aber es weiß nicht, wie von Mahlzeit zu bekommen -> Essen.Aus diesem Grunde müssen Sie die gleiche Beziehung rund um die andere Art und Weise zu definieren, etwa so:

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

Dies fügt keine neue Schlüssel, da es meal.idFood definieren würde, die Sie bereits mit Ihrer ersten Anweisung definiert.

Jetzt sollten Sie in der Lage sein, noch auszuführen

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

Ausgezeichnet! Dies gab mir das Ergebnis, das ich wollte, nur eine letzte Frage .. Ich drucke die JSON.stringify (Mahlzeiten) und es zeigt jeden Teil der Daten, aber was ist, wenn ich einige dieser Werte von selbst, wie zugreifen wollte könnte ich es tun? – leofontes

+0

Wie Zugriff auf jedes Essen? –

+0

Egal, ich habe es herausgefunden, vielen Dank! – leofontes

0

Wenn Sie einen Alias ​​für die Zuordnung verwenden ({ as: 'Food' }), müssen Sie ihn auch für die include-Anweisung verwenden.

So würde es so sein:

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

Weitere Informationen here.

+0

gibt mir den Fehler: Unhandle Ablehnung Fehler: Lebensmittel (Food) ist nicht auf Essen zugeordnet! – leofontes

+0

Lesen der Dokumentation (wieder), das Beispiel macht Sinn, aber ich denke nicht, dass das Beispiel auf meine Situation anwendbar ist, weil in ihrem Beispiel Benutzer eine Aufgabe hat und Aufgabe zu Benutzer gehört. Aber in meinem Fall gehört Essen nicht zu einer Mahlzeit, weil viele Mahlzeiten dasselbe Essen in verschiedenen Mengen (oder für verschiedene Benutzer) haben können. Wie kann ich das umgehen? – leofontes

+0

@leofontes in Ihrer Situation müssen Sie viele-zu-viele Beziehung implementieren, eine Mahlzeit kann viele Lebensmittel haben, und ein Essen kann in mehreren Mahlzeiten verwendet werden, so dass es Sinn macht. Befolgen Sie die Dokumentation, um diese Art von Beziehung zu implementieren. –