Sequelize hasMany присоединиться к ассоциации

я расширяю свое приложение, и мне нужно присоединиться к двум моделям, которые я ранее создал с Sequelize, они следующие:

питание

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 на еду

быстро объясняя, что происходит, еда таблица с много еды (duh) как хлеб, рис, фасоли, etc. питание это таблица, которая определяет, какую пищу пользователь выбрал со своими деталями.

поэтому, насколько я понимаю, это питание много еда (как я добавил раньше), но еда не требует каких-либо отношений с питание, поскольку он просто содержит данные и не изменяется после первого заполнения. Но когда я попытался присоединиться к ним с:

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

я получил следующую ошибку:

Unhandled rejection Error: food is not associated to meal!

Can кто-нибудь объяснит, что мне делать? Я думаю, что это связано с отношениями, но я не смог найти в документации никакого хорошего объяснения тому, что я должен делать.

спасибо!

Edit: чтение документации (снова), пример имеет смысл, но я не думаю, что пример применим к моей ситуации, потому что на их примере у пользователя есть задача, а задача принадлежит пользователю. Но в моем случае, еда не относится к еде, потому что многие блюда могут быть одна и та же еда в разных количествах (или для разных пользователей).

2 ответов


проблема в том, что отношение должно быть определено в обоих направлениях. В настоящее время 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`
});

Если вы используете псевдоним ассоциации ({ as: 'Food' }) вам также нужно использовать его в инструкции include.

Так это было бы так:

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

если ассоциация имеет псевдонимы (с помощью опции as), необходимо указать этот псевдоним при включении модели. Обратите внимание, как инструменты пользователя псевдонимы как инструменты выше. Чтобы получить это право, вы должны указать модель, которую хотите загрузить, а также псевдоним

больше информация здесь.