How to build model with sequelize for belong to many association

僤鯓⒐⒋嵵緔 提交于 2019-12-13 17:30:03

问题


This is what I wrote in Country.js (exactly the same as User.js except datatypes) :

module.exports = function(sequelize, DataTypes) {
    const Country = sequelize.define('country', 
    {
        id: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        code: {
            type: DataTypes.INTEGER        
        },
        alpha2: {
            type: DataTypes.STRING
        },
        alpha3: {
            type: DataTypes.STRING
        },
        name_en: {
            type: DataTypes.STRING
        },
        name_fr: {
            type: DataTypes.STRING
        }
    },
    {
        freezeTableName: true,
        timestamps: false
    });

    Country.associate = ( models ) => {
      models.Country.belongsToMany(models.User, {
        through: 'country_user',
        as: 'user',
        foreignKey: 'id_country'
      });
    };

    return Country;
}

This is my query :

router.get('/thisuserCountries', function(req, res, next){
    User(db, Sequelize.DataTypes).findOne({
        include: [{
            model: Country(db, Sequelize.DataTypes),
            as: 'countries',
            required: false,
            attributes: ['id'],
        }],
        where: {
            email: 'jerome.charlat@gmail.com'
        }       
    })
      .then(user => {
          if(user) {
              res.json(user)
          }
          else {
              res.send('User does not exist')
          }
      })
      .catch(err => {
          res.send('error: ' + err)
      })
})

This is my db.js :

const Sequelize = require('sequelize')
const db = new Sequelize('travel_memories', 'root', '', {
    host: 'localhost',
    dialect: 'mysql',
    port: 3306
})

db
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });

const models = {
  Country: db.import('../models/Country'),
  User: db.import('../models/User'),
  CountryUserJoin: db.import('../models/Country_user')
};

Object.keys(models).forEach((modelName) => {
  if('associate' in models[modelName]){
    models[modelName].associate(models);
  }
});

module.exports = db

Postman says : error SequelizeEagerLoadingError: country is not associated to user!

But, I think I should write in the through parameter the model User_country when I associate tables in each model. So i tried to write something like :

Country.associate = ( models ) => {
      models.Country.belongsToMany(models.User, {
        through: models.Country_user,
        as: 'user',
        foreignKey: 'id_country'
      });
    };

And console says when I launch server, before querying anything :

SequelizeAssociationError: country.belongsToMany(user) requires through option, pass either a string or a model.

So I am blocked. I used the example in documentation to write the assocation with models.foo. But in fact models comes from nowhere..

Thanks again for your help !


回答1:


There's not a lot of documentation about this, but here it says that you should use a through option when querying or selecting belongs-to-many attributes, just like this:

...
User(db, Sequelize.DataTypes).findOne({
  include: [{
    model: Country(db, Sequelize.DataTypes),
    as: 'countries',
    required: false,
    through: {
      attributes: ['id']
    }
  }],
  where: {
    email: 'jerome.charlat@gmail.com'
  }       
})
...


来源:https://stackoverflow.com/questions/56930091/how-to-build-model-with-sequelize-for-belong-to-many-association

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!