2016-06-28 17 views
5

mi rozwijać własny wniosek i muszę połączyć dwa modele Wcześniej utworzone z Sequelize, są one w następujący sposób:Sequelize hasMany Dołącz stowarzyszenie

Meal

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

Food

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

I dodaje się następującą zależność:

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

Linia ta dodaje kolumnę idFood na posiłek

Szybko wyjaśniając, co się dzieje, Food jest stolik z wielu produktów spożywczych (duh), takich jak chleb, ryż, fasola, itp Meal jest tabela, która identyfikuje żywność wybraną przez użytkownika wraz z ich szczegółami.

Dlatego moje zrozumienie, że Meal miał wiele Żywność (jak dodałem wcześniej), ale Food nie wymaga żadnej relacji z Meal, ponieważ po prostu przechowuje dane i nie zmienia się po Najpierw zapełniam to. Ale kiedy próbowałem połączyć je z:

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

mam następujący błąd:

Unhandled rejection Error: food is not associated to meal! 

może ktoś wyjaśnić, co mam zrobić? Myślę, że ma to związek z relacjami, ale nie znalazłem w dokumentacji żadnych dobrych wyjaśnień co do tego, co powinienem zrobić.

Dziękujemy!

Edycja: Czytanie dokumentacji (again), przykład ma sens, ale nie sądzę, że przykład dotyczy mojej sytuacji, ponieważ na ich przykładzie Użytkownik ma Zadanie, a Zadanie należy do Użytkownika. Ale w moim przypadku Żywność nie należy do Posiłku, ponieważ wiele Posiłków może mieć to samo Jedzenie w różnych ilościach (lub dla różnych użytkowników).

Odpowiedz

6

Problem polega na tym, że relację należy zdefiniować w obie strony. Obecnie Sequelize wie, jak dostać się z żywnością -> Mąka z powodu

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

ale nie wiem jak dostać się z Meal -> Żywności.Dlatego trzeba zdefiniować samą zależność odwrotnie, tak jak poniżej:

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

To nie dodaje żadnych nowychklucze ponieważ byłoby to określić meal.idFood którym zdefiniowany przy pierwszym rachunku już.

Teraz powinieneś być w stanie wykonać

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

Doskonała! To dało mi wynik, którego chciałem, tylko jedno ostatnie pytanie. Drukuję JSON.stringify (posiłki) i pokazuje on wszystkie części danych, ale co, gdybym chciał uzyskać dostęp do niektórych z tych wartości samodzielnie, jak czy mogę to zrobić? – leofontes

+0

Podobnie jak dostęp do każdej żywności? –

+0

Nieważne, wymyśliłem to, dziękuję bardzo! – leofontes

0

Jeśli używasz aliasu w powiązaniu ({ as: 'Food' }), musisz go również użyć w instrukcji include.

Więc to byłoby tak:

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

Więcej informacji here.

+0

nadal daje mi błąd: Unhandled odrzucenie błędu: Żywność (Food) nie jest związana z posiłkiem! – leofontes

+0

Czytanie dokumentacji (ponownie), przykład ma sens, ale nie sądzę, że przykład dotyczy mojej sytuacji, ponieważ na ich przykładzie Użytkownik ma Zadanie, a Zadanie należy do Użytkownika. Ale w moim przypadku Żywność nie należy do Posiłku, ponieważ wiele Posiłków może mieć to samo Jedzenie w różnych ilościach (lub dla różnych użytkowników). Jak mogę to obejść? – leofontes

+0

@leofontes w twojej sytuacji musisz wprowadzić wiele do wielu relacji, posiłek może mieć wiele produktów spożywczych, a jedna żywność może być używana w wielu posiłkach, więc ma to sens. Postępuj zgodnie z dokumentacją, aby wdrożyć ten rodzaj relacji. –