Продолжить отношения "многие ко многим", ссылаясь на неправильное имя столбца - PullRequest
0 голосов
/ 26 мая 2020

У меня есть таблица RecipeIngredient, которая содержит PK таблиц рецептов и ингредиентов, как показано ниже:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('RecipeIngredients', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      recipe_id: {
        type: Sequelize.INTEGER, 
        references: { model: 'Recipes', field: 'id' }
      },
      ingredient_id: {
        type: Sequelize.INTEGER, 
        references: { model: 'Ingredients', field: 'id'}
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('RecipeIngredients');
  }
};

Если я просто попытаюсь запросить приведенную выше таблицу, используя следующий код:

models.RecipeIngredient.findAll().then(all => console.log(all))

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

Executing (default): SELECT "recipe_id", "ingredient_id", "createdAt", "updatedAt", "IngredientId", "RecipeId" FROM "RecipeIngredients" AS "RecipeIngredient";
Unhandled rejection SequelizeDatabaseError: column "IngredientId" does not exist

Почему Sequelize считает, что существует столбец с именем «IngredientId»? Имя столбца - «component_id».

ОБНОВЛЕНО: добавлены модальные определения

Рецепт:

'use strict';
module.exports = (sequelize, DataTypes) => {
  var Recipe = sequelize.define('Recipe', {
    name: DataTypes.STRING
  }, {});
  Recipe.associate = function(models) {
    Recipe.belongsToMany(models.Ingredient, {
      as: 'ingredients', through: { model: models.RecipeIngredient, foreignKey: 'recipe_id'}
    })
    // associations can be defined here
  };
  return Recipe;
};

Ингредиент:

'use strict';
module.exports = (sequelize, DataTypes) => {
  var Ingredient = sequelize.define('Ingredient', {
    name: DataTypes.STRING
  }, {});
  Ingredient.associate = function(models) {
    Ingredient.belongsToMany(models.Recipe, { as: 'recipes', through: { model: models.RecipeIngredient, foreignKey: 'ingredient_id'}})
  };
  return Ingredient;
};

RecipeIngredient:

 'use strict';
module.exports = (sequelize, DataTypes) => {
  var RecipeIngredient = sequelize.define('RecipeIngredient', {
    recipe_id: DataTypes.INTEGER,
    ingredient_id: DataTypes.INTEGER
  }, {});
  RecipeIngredient.associate = function(models) {
    // associations can be defined here
  };
  return RecipeIngredient;
};

1 Ответ

1 голос
/ 26 мая 2020

В файле, который вы настраиваете базу данных, поместите определение с ним внутри:

underscored: true,
underscoredAll: true,
freezeTableName: true,

Пример моей конфигурации. js

require("dotenv").config();

module.exports = {
    dialect: process.env.DB_DIALECT,
    host: process.env.DB_HOST,
    username: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_DATABASE,
    define: {
        timestamps: true,
        underscored: true,
        underscoredAll: true,
        freezeTableName: true,
    },
};

...