node.js - 如何使用 Feathers 和 Sequelize 定义多对多,并在连接表中添加附加字段?

标签 node.js sequelize.js feathersjs

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

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

在像User_Organization_Role这样的表中,我需要有role(roleId?)、isActive等字段。也许还有更多。

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

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

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

最佳答案

n:m 关系是迄今为止最难处理的,并且确实没有一刀切的解决方案。最重要的是 read and understand this page and its sub-pages ,然后再阅读两遍以获得更好的效果。尝试一次专注于做一件事。我在本期概述了如何使用 FeathersJS 来解决这个问题:

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

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

  1. 首先创建或更新您的主要对象(用户、组织、角色等)。目前尚未建立任何关系。您需要先创建对象,然后才能建立任何关系。

  2. 创建或更新关系。这涉及使用步骤 #1 中的数据更新“连接”表(又名:“映射”或“通过”表)。连接表可以(并且应该)有自己的模型。它应该包含您关联的每个对象(userId、organizationId、roleId 等)的外键。您也可以将其他字段放入此表中。

这是一些关于如何定义模型的伪代码(为了简洁起见,仅显示相关代码)。它的内容比我下面描述的要多一些,但这应该可以帮助您入门。

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

关于node.js - 如何使用 Feathers 和 Sequelize 定义多对多,并在连接表中添加附加字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51827290/

相关文章:

javascript - 如何检查/迭代 Node 中的对象?

node.js - 需要 ('https' )与需要 ('tls' )

javascript - 为什么 sequelize 将我包含的每个模型的 COUNT 加在一起?

javascript - 后面有数据库的 Node/羽毛

https - Feathersjs -> socketio https 请求不起作用

javascript - Express 服务器为我的静态文件提供服务,但不处理对我的 API 的请求。怎么了?

javascript - node.js 回调已被调用错误

node.js - Sequelize cli 模型创建

javascript - 手动更新记录时不触发 Sequelize Hook

sequelize.js - 为什么 [Op.and] 在这种情况下使用 Sequelize 不起作用?