【问题标题】:Create instance in a sequelize belongs-to-many relation在 sequelize belongs-to-many 关系中创建实例
【发布时间】:2019-02-21 04:32:11
【问题描述】:

我无法理解有关 Belongs-to-Many 关系的 sequelize 文档。我已经能够在数据库本身中正确设置它,但是现在我想执行基本的 CRUD 操作,我很迷茫。

所以事情是这样的:我有用户和聊天室。每当用户创建聊天室时,我希望它成为房间的所有者以及参与者。

问题是...我不知道如何将此用户添加到参与者。 DB 方面,有一个 chatroom_user 表,其中包含用户 ID 和聊天室 ID。 根据我从 sequelize 文档中了解到的情况,我必须在我的模型中创建一个 addXXXXX 函数,在解析器中使用所需的参数添加调用它......但这不起作用......

这是我的代码

聊天室模型:

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);
            }
        },

    }
};

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

【问题讨论】:

  • 为什么不把 owner 的逻辑移到 chatroom_user 表中,添加一个新的 owner 为 Boolean 的列呢?
  • “所有者”不在 chatroom_user 表中。其中只有用户 ID 和聊天室 ID。所有者是“聊天室”表中包含用户 ID 的列

标签: node.js sequelize.js graphql


【解决方案1】:

我可以建议您执行以下操作,从聊天室中删除所有者并将所有者移动到连接表,在您的情况下是 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         |

【讨论】:

  • 非常感谢 Javed 抽出时间回复我 :) 但是我想我可能还不够清楚。我的问题并不是真正的所有者字段(不过,感谢您分享您的解决方案,这确实可能很方便)。我的问题是关于编写我的整个 createChatroom 突变。我写的当前代码崩溃了(这并不让我感到惊讶,因为我不知道我在做什么......)。房间创建工作,但它应该将我当前用户分配到连接表中当前聊天室的第二部分失败了。这是我的主要问题;)
  • 如果你的关联是正确的,你应该不需要手动做,你能检查一下表中正在更新哪些数据吗?
  • 我尝试了你的新代码。我注意到你为 UserChatroom 创建了一个新模型。起初,我以为是聊天室模型……现在,如果我离开 .then() 函数,它会崩溃,说 models.chatroom.addUser 不是函数。如果我删除它,它会尝试执行以下 SQL 操作:执行(默认):INSERT INTO "chatrooms" ("id","created_at","updated_at") VALUES (DEFAULT,'2018-09-17 13:51 :46.240 +00:00','2018-09-17 13:51:46.240 +00:00') 返回 *;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
相关资源
最近更新 更多