簡體   English   中英

中間表中的多對多關系和一對多關系

[英]Sequelize many-to-many relation and one-to-many in intermediate table

您有一個表通過UsersGroupsGroups多對多關系的Users UsersGroups具有FK到UsersGroupsRoles

在此輸入圖像描述

用戶:

module.exports = (sequelize, Sequelize) => {
    const Users = sequelize.define(
        'Users',
        {
            id: {
                type: Sequelize.UUID,
                defaultValue: Sequelize.UUIDV4,
                primaryKey: true,
            },

            name: {
                type: Sequelize.STRING,
            },
        },
        {}
    );
    Users.associate = function(models) {
        Users.belongsToMany(models.Groups, { through: models.UsersGroups });
    };

    return Users;
};

團體:

module.exports = (sequelize, Sequelize) => {
    const Groups = sequelize.define(
        'Groups',
        {
            id: {
                type: Sequelize.INTEGER,
                autoIncrement: true,
                primaryKey: true,
                allowNull: false,
            },

            name: {
                type: Sequelize.STRING,
            },
        },
        {}
    );

    Groups.associate = function(models) {
        Groups.belongsToMany(models.Users, { through: models.UsersGroups });
    };

    return Groups;
};

UsersGroups:

module.exports = (sequelize, Sequelize) => {
    const UsersGroups = sequelize.define(
        'UsersGroups',
        {
            order: {
                allowNull: true,
                type: Sequelize.INTEGER,
                defaultValue: 10000,
            },
        },
        {}
    );
    UsersGroups.associate = function(models) {
        UsersGroups.belongsTo(models.UsersGroupsRoles, { as: 'UsersGroupsRoles', onDelete: 'CASCADE' });
    };

    return UsersGroups;
};

UsersGroupsRoles:

module.exports = (sequelize, Sequelize) => {
    const UsersGroupsRoles = sequelize.define(
        'UsersGroupsRoles',
        {
            id: {
                type: Sequelize.INTEGER,
                autoIncrement: true,
                primaryKey: true,
                allowNull: false,
            },

            role: {
                type: Sequelize.STRING,
            },
        },
        {}
    );

    UsersGroupsRoles.associate = function(models) {
        UsersGroupsRoles.hasMany(models.UsersGroups, { as: 'UsersGroupsRoles', onDelete: 'CASCADE' });
    };

    return UsersGroupsRoles;
};

現在我想查詢Users和UsersGroups,並獲取UsersGroupsRoles

models.Groups.findAll({
    attributes: {
        exclude: ['createdAt', 'updatedAt'],
    },
    include: [
        {
            model: models.Users,
            attributes: {
                exclude: ['createdAt', 'updatedAt', 'email', 'password'],
            },
            through: {
                include: [
                    {
                        model: models.UsersGroupsRoles,
                        as: 'UsersGroupsRoles',
                    },
                ],
            },
        },
    ],
})

但是查詢因TypeError: Cannot read property 'indexOf' of undefined而失敗TypeError: Cannot read property 'indexOf' of undefined 我想這是因為through內的include子句,但是在中間表中包含一對多關聯的正確方法是什么?

謝謝!

試試這個怎么樣?

try {
    let groups = await models.Groups.findAll({
      attributes: {
          exclude: ['id','createdAt', 'updatedAt'],
      }
    })

    const userGroupsPromises = groups.map(group => {
      return models.UsersGroups.findAll({
        where: {
          groupId: group.id
        },
        include: [{
          model: models.User,
          attributes: {
            exclude: ['createdAt', 'updatedAt', 'email', 'password'],
        }
        }, {
          model: models.UsersGroupsRoles,
        }]
      })
    })

    const userGroupsPromiseResult = await Promise.all(userGroupsPromises)

    groups = groups.map((group, index) => {
      const _group = group.get()
      _group.UserGroups = userGroupsPromiseResult[index]

      return _group
    })

    console.log(groups)
  } catch (err) {
    console.log(err)
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM