gpt4 book ai didi

javascript - bookshelf.js 中的多表关系

转载 作者:行者123 更新时间:2023-11-29 12:25:26 24 4
gpt4 key购买 nike

我正在尝试使用 bookshelf.js 作为 Postgresql 的 ORM 在 node.js 应用程序中实现基于 Angular 色的访问控制。我有以下架构:

USERS <- USERS_ROLES -> ROLES <- ROLES_RIGHTS -> RIGHTS

我希望能够获得用户拥有的所有权利。在 sql 中,我会这样做:

SELECT rights.*
FROM rights
INNER JOIN roles_rights ON roles_rights.right_id=rights.id
INNER JOIN users_roles ON users_roles.role_id = roles_rights.role_id
WHERE users_roles.user_id=1
GROUP BY rights.id

作为 Bookshelf.js 的新手,我在弄清楚如何建立关系时遇到了一些麻烦。这是我的第一次尝试:

const User = bookshelf.Model.extend({

tableName: 'users',

roles: function() {
return this.belongsToMany(Role, 'users_roles', 'user_id', 'role_id')
},

rights: function() {
return this.belongsToMany(Right, 'users_roles', 'user_id', 'role_id')
.query(qb => qb
.innerJoin('roles_rights', 'roles_rights.right_id', 'rights.id')
)
}

})

const Role = bookshelf.Model.extend({

tableName: 'roles',

rights: function() {
return this.belongsToMany(Right, 'roles_rights', 'role_id', 'right_id')
},

users: function() {
return this.belongsToMany(User, 'users_roles', 'user_id', 'role_id')
}

})

const Right = bookshelf.Model.extend({

tableName: 'rights',

roles: function() {
return this.belongsToMany(Role, 'users_roles', 'user_id', 'role_id')
}

})

它没有用...:-(

最终,我想让这个查询工作:

User.where({ id: req.user.get('id') })
.fetch({ withRelated: ['rights'] })
.then(user => {
...
})
})

如有任何帮助,我们将不胜感激!

最佳答案

在为同一个问题苦苦挣扎了一段时间后,这是我最接近可用的解决方案。

无需对您描述的模型进行任何修改(除了从 User 模型中删除 rights 关系),您可以这样做:

User.where({ id: req.user.get('id') })
.fetch({ withRelated: ['roles.rights'] })
.then(user => {
console.log(JSON.stringify(user));
})
})

我发现这更适合我的用例,因为我将始终拥有可用的用户 Angular 色和其中的 Angular 色权限。

像这样:

{
id: 12
roles: [
{
id: 21,
rights: [
{
id: 11,
name: 'DELETE'
}
]
}
]
}

如果您确实想要用户从所有用户 Angular 色组合的所有权限,您可以使用 Bookshelf 的虚拟插件并创建一个虚拟行。

const User = bookshelf.Model.extend({

tableName: 'users',

roles: function() {
return this.belongsToMany(Role, 'users_roles', 'user_id', 'role_id')
},

virtuals: {
rights: {
get: function () {
const rightsIds = new Set();
return this.related('roles').reduce((rights, group) => {
return group.related('rights').reduce((rights, right) => {
if (!rightsIds.has(right.id)) {
rightsIds.add(right.id);
rights.push(right);
}
return rights;
}, rights);
}, []);
}
}
},
});

像这样使用它:

User.where({ id: req.user.get('id') })
.fetch({ withRelated: ['roles.rights'] })
.then(user => {
console.log(JSON.stringify(user.get('rights'));
})
})

初始化书架时必须启用虚拟插件:

bookshelf.plugin(['virtuals']);

这不是最优雅的解决方案,但如果您想用书架做所有事情,就是这样。每当书架让我失望时,我就使用 knex(这种情况经常发生)。

关于javascript - bookshelf.js 中的多表关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41475879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com