如何用sequelize建立模型属于多个关联

时间:2019-07-08 07:22:02

标签: node.js sequelize.js

这就是我在Country.js中写的(除了数据类型与User.js完全相同):

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;
}

这是我的查询:

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)
      })
})

这是我的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

邮递员说:错误SequelizeEagerLoadingError:国家未与用户关联!

但是,我认为在关联每个模型中的表时,应该在through参数中编写模型User_country。所以我试图写一些类似的东西:

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

控制台说我启动服务器时,在查询任何内容之前:

SequelizeAssociationError:country.belongsToMany(用户)需要通过选项,传递字符串或模型。

所以我被封锁了。我使用文档中的示例来编写与models.foo的关联。但是实际上模型无处不在。

再次感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

关于此的文档并不多,但是here表示在查询或选择“多对多”属性时应使用through选项,就像这样:

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