我很难理解关于Belongs-to-Many关系的续集文档。我已经能够在数据库本身中正确设置它,但现在我想执行基本的CRUD操作,我很丢失。
所以这就是:我有用户和聊天室。每当用户创建聊天室时,我希望它成为房间的所有者以及参与者。
问题是......我无法想出如何将此用户添加到参与者。在数据库方面,有一个chatroom_user表,其中包含用户ID和聊天室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
更新连接表user_chatroom,值为true,否则为false
这样的事情
id| owner | user_id|chatroom_id|
1 | false | 1 | 1 |
2 | true | 2 | 1 |
3 | false | 3 | 1 |