簡體   English   中英

在序列化多對多關系中創建實例

[英]Create instance in a sequelize belongs-to-many relation

我很難理解有關“多對多”關系的續集文檔。 我已經能夠在數據庫本身中正確地設置它,但是現在我想要執行基本的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);
            }
        },

    }
};

所以,是的,我知道這絕對不是做到這一點的方法,但是我搜索了許多教程,卻沒有找到可行的解決方案... :(

我可以建議您以下操作,從聊天室中刪除所有者,然后將所有者移動到聯接表(在您的情況下為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 (如果該用戶是該聊天室的所有者,則為true)更新聯接表user_chatroom,否則將其為false

像這樣的東西

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

暫無
暫無

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

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