我正在努力寻找解决方案。
我想拥有可以属于许多组织的用户。 在特定的组织中,每个用户可以具有不同的角色(我甚至更喜欢角色,但听起来更复杂...)。
在类似User_Organization_Role
的表中,我需要具有类似role
(roleId?),isActive
的字段。也许更多。
我正在使用Feathers Plus生成器,但在这种情况下我认为这并不重要,但是在schema
文件中添加某些内容可能会有所帮助?
我认为仅具有简单的organizationId
字段的belongsTo就足够了,但后来我意识到将其更改为manyToMany会很痛苦,所以我认为现在更好地实现它。
我将不胜感激任何解决方案/建议/最佳做法等。
答案 0 :(得分:2)
n:m
关系是迄今为止最难处理的,并且实际上没有一种万能的解决方案。最大的事情是read and understand this page,然后再阅读两次以取得良好的效果。尝试着重于一次做一件事。我概述了在本期中如何使用feathersjs来解决这个问题:
https://github.com/feathersjs/feathers/issues/852#issuecomment-406413342
可以在任何应用程序中应用相同的技术...基本流程如下:
首先创建或更新您的主要对象(用户,组织,角色等)。目前没有任何关系。建立关系之前,需要先创建对象。
创建或更新关系。这涉及使用步骤#1中的数据更新“联接”表(aka:“映射”或“通过”表)。联接表可以(并且应该)具有自己的模型。它应为您要关联的每个对象(用户ID,组织ID,角色ID等)包含一个外键。您也可以在此表中放置其他字段。
这是一些有关如何定义模型的伪代码(为简洁起见仅显示相关代码)。除了我在下面描述的内容之外,还有其他内容,但这应该可以帮助您入门。
const UserOrganizationRole = sequelize.define('User_Organization_Role', {
// Define any custom fields you want
foo: DataTypes.STRING
})
// Let sequelize add the foreign key fields for you.
// Also, save a reference to the relationship - we will use it later
User.Organization = User.belongsToMany(Organization, { through: UserOrganizationRole });
User.Role = User.belongsToMany(Role, { through: UserOrganizationRole });
Organization.User = Organization.belongsToMany(User, { through: UserOrganizationRole });
Role.User = Role.belongsToMany(User, { through: UserOrganizationRole });
...这就是我处理插入内容的方式
const user = await User.create({ ... });
const org = await Organization.create({ ... });
const role = await Role.create({ ... });
await UserOrganizationRole.create({
userId: user.id,
organizationId: org.id,
roleId: role.id,
foo: 'bar'
});
...最后,像这样加载数据:
// Now we can reference those relationships we created earlier:
const user = await User.findById(123, {
include: [User.Organization, User.Role]
});
const org = await Organization.findById(456, {
include: [Organization.User]
});