以序列化多对多关系创建实例

时间:2018-09-17 09:23:49

标签: node.js sequelize.js graphql

我很难理解有关“多对多”关系的后续文档。我已经可以在数据库本身中正确地设置它,但是现在我想要执行基本的CRUD操作,我就迷路了。

这就是问题:我有用户和聊天室。每当用户创建聊天室时,我都希望它成为聊天室的所有者以及参与者。

问题是...我不知道如何将此用户添加到参与者。在数据库方面,有一个chatroom_user表,其中包含用户ID和chatroom ID。 根据我从sequelize文档中了解到的信息,我必须在模型中创建一个addXXXXX函数,并在解析器中使用所需的args对其进行调用...但这是行不通的...

这是我的代码

聊天室模型:

export default (sequelize, Datatypes) => {
    const Chatroom = sequelize.define('chatroom', {
        publicRoom: {
            type: Datatypes.BOOLEAN,
            allowNull: false
        },
    });

    Chatroom.associate = (models) => {
        Chatroom.belongsTo(models.user, {
            foreignKey: {
                name: 'owner',
                allowNull: false
            }
        });
        Chatroom.belongsToMany(models.user, {
            through: 'user_chatroom',
            foreignKey: {
                name: 'chatroom',
                allowNull: false
            },
            onDelete: 'CASCADE'
        });
        Chatroom.addUsers(models.user);
    };

聊天室解析器:

export default {
    Query: {
        // some queries here...
    },
    Mutation: {
        createChatroom: async (parent, args, {models, user}, info) => {
            try {
                return await models.chatroom.create({owner: user.id})
                    .then(models.chatroom.addUsers(user.id));
            } catch (err) {
                console.log(err);
            }
        },

    }
};

是的,我知道这绝对不是这样做的方法,但是我搜索了许多教程,却没有找到可行的解决方案...:(

1 个答案:

答案 0 :(得分:0)

我可以建议您以下操作,从聊天室中删除所有者,然后将所有者移动到联接表(在您的情况下为chatroom_user表)中。

export default (sequelize, DataTypes) => {
  const Chatroom = sequelize.define('chatroom', {
    name: DataTypes.STRING,
    publicRoom: {
        type: Datatypes.BOOLEAN,
        allowNull: false
    },
  });

  Chatroom.associate = (models) => {
    Chatroom.belongsToMany(models.User, {
      through: 'user_chatroom',
      foreignKey: {
        name: 'userId',
        field: 'user_id',
      },
    });
  };
  return Chatroom;
};

然后在您的UserChatroom表中

 export default (sequelize, DataTypes) => {
  const UserChatroom = sequelize.define('user_chatroom', {
    owner: {
      type: DataTypes.BOOLEAN,
      defaultValues: false,
    },
  });

  return UserChatroom;
};

,然后在您的解析器中,当您创建ChatRoom时,使用附加列owner更新联接表user_chatroom,如果用户是聊天室的所有者,则将其值设置为true;否则将其设置为false

像这样的东西

id| owner | user_id|chatroom_id|
1 | false | 1      | 1         |
2 | true  | 2      | 1         |
3 | false | 3      | 1         |