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

Posted

技术标签:

【中文标题】如何使用 sequelize 建立模型属于多关联【英文标题】:How to build model with sequelize for belong to many association 【发布时间】:2019-07-08 07:22:02 【问题描述】:

这是我在 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: country is not associated to user!

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

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

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

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

所以我被屏蔽了。我使用文档中的示例来编写与 models.foo 的关联。但实际上模型无处可寻..

再次感谢您的帮助!

【问题讨论】:

【参考方案1】:

关于此的文档并不多,但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'
         
)
...

【讨论】:

问题是我在使用这条路线之前就遇到了错误。当我启动服务器节点时。根据控制台中的错误,问题与模型相关联。这里其实是:User.associate = ( models ) => User.belongsToMany(Country, through: models.Country_user ...]);

以上是关于如何使用 sequelize 建立模型属于多关联的主要内容,如果未能解决你的问题,请参考以下文章

跨 Sequelize 关联播种数据

续集:如何为关联做等效的 findAndCountAll

在 Sequelize 中从关联创建复合主键

Node.js / Sequelize.js / Express.js - 如何插入多对多关联? (同步/异步?)

Sequelize:模型未关联到 Model2

如何在 Sequelize 中对 belongsToMany 关联进行***查询?