简体   繁体   中英

Sequelize – many to many associations

I have two models defined:

db/models/User.js

const Sequelize = require('sequelize');

module.exports = (sequelize, DataTypes) => {
  class User extends Sequelize.Model {}

  const config = {
    sequelize,
    modelName: 'user',
    underscored: true,
    paranoid: true,
  });

  User.init({
    first_name: {
      type: DataTypes.STRING,
    },
    last_name: {
      type: DataTypes.STRING,
    },
  }, config);

  return User;
};

db/models/Group.js

const Sequelize = require('sequelize');

module.exports = (sequelize, DataTypes) => {
  class Group extends Sequelize.Model {}

  const config = {
    sequelize,
    modelName: 'group',
    underscored: true,
    paranoid: true,
  });

  Group.init({
    name: {
      type: DataTypes.STRING,
      allowNull: false,
    },
  }, config);

  return Group;
};

I want to create many-to-many association between then (so a group can have many users, and a user can belong to many groups. Here is my db/index.js :

db/index.js

const Sequelize = require('sequelize');
const Logger = require('../config/logger');
const { DB } = require('../config/vars');
const UserModel = require('./models/User');
const GroupModel = require('./models/Group');

const sequelize = new Sequelize(
  DB.name,
  DB.username,
  DB.password,
  {
    host: DB.host,
    dialect: 'postgres',
  },
);

const Models = {
  User: UserModel(sequelize, Sequelize),
  Group: GroupModel(sequelize, Sequelize),
};

const setup = async () => {
  // Associations
  Models.User.belongsToMany(Models.Group, {
    through: 'UserGroups',
    as: { singular: 'group', plural: 'groups' },
  });
  Models.Group.belongsToMany(Models.User, {
    through: 'UserGroups',
    as: { singuler: 'user', plural: 'users' },
  });
  await sequelize.sync({ force: true });
};

module.exports = {
  ...Models,
  setup,
  Seeders,
  Sequelize,
  sequelize,
};

When I do User.findAll() , there is no groups attribute returned in the object. How should I properly set up many-to-many relationship here?

User.findAll() will return it associated models by defaults, you need to use include like this :

User.findAll({
    include : {
        model : Groups 
    }
})

SIMPLE GUIDE

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM