如何用Feathers定义多对多,并在联接表中使用附加字段定义Sequelize?

时间:2018-08-13 17:03:06

标签: node.js sequelize.js feathersjs

我正在努力寻找解决方案。

我想拥有可以属于许多组织的用户。 在特定的组织中,每个用户可以具有不同的角色(我甚至更喜欢角色,但听起来更复杂...)。

在类似User_Organization_Role的表中,我需要具有类似role(roleId?),isActive的字段。也许更多。

我正在使用Feathers Plus生成器,但在这种情况下我认为这并不重要,但是在schema文件中添加某些内容可能会有所帮助?

我认为仅具有简单的organizationId字段的belongsTo就足够了,但后来我意识到将其更改为manyToMany会很痛苦,所以我认为现在更好地实现它。

我将不胜感激任何解决方案/建议/最佳做法等。

1 个答案:

答案 0 :(得分:2)

n:m关系是迄今为止最难处理的,并且实际上没有一种万能的解决方案。最大的事情是read and understand this page,然后再阅读两次以取得良好的效果。尝试着重于一次做一件事。我概述了在本期中如何使用feathersjs来解决这个问题:

https://github.com/feathersjs/feathers/issues/852#issuecomment-406413342

可以在任何应用程序中应用相同的技术...基本流程如下:

  1. 首先创建或更新您的主要对象(用户,组织,角色等)。目前没有任何关系。建立关系之前,需要先创建对象。

  2. 创建或更新关系。这涉及使用步骤#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]
});