gpt4 book ai didi

sails.js - 使用现有连接表的一对多关联

转载 作者:行者123 更新时间:2023-12-04 22:20:43 25 4
gpt4 key购买 nike

我正在转换使用 MariaDB 的现有应用程序的后端以使用 Sails (v0.10.0-rc7),并且我一直在试图弄清楚如何获取填充到 Role 模型中的角色的所有权限给定基础架构结构我要一起工作。

有三个表用于当前获取角色及其关联的权限,工作查询如下所示:

SELECT pm.permission, pm.permkey
FROM role_master rm
INNER JOIN role_perm rp ON ( rm.roleid = rp.roleid )
INNER JOIN perm_master pm ON ( rp.permid = pm.permid )
WHERE rm.roleid = 1
GROUP By pm.permission

如您所见, role_master 中有角色定义, role_perm 中有每个角色的单独权限,最后是 perm_master 中的权限定义。

我已经阅读了关于关联的 this awesome wiki,但我没有看到任何对我有帮助的内容。

理想情况下,我想最终得到一个输出的角色模型:
{
"id" : 1,
"name" : "My Role Name",
"description" : "My Role Description",
"permissions" : [ 'canread', 'canwrite', 'canjump', 'canplay' ]
}

在不修改底层数据库的情况下完成此操作的最佳方法是什么?

最佳答案

Waterline 的优点之一是能够将模型映射到您的自定义表和列名称。然而,目前我们没有一个很好的方法来为自动生成的连接表做到这一点。我投入的早期作品之一是能够创建 through 关联。这些本质上允许您构建一个用作连接表的模型。我们后来决定这基本上只是一个嵌套的填充,但我将 through 逻辑留在那里以用于此类用例。

您无法向直通表添加其他属性,但如果您为连接表映射出两个值,您的查询和蓝图路由将正常运行。现在有一个关于直通表所需的主键值的小说明,但这只是架构构建器中的一个错误,应该很快解决。

以下逻辑当前未记录在案,但可以帮助您获得所需的结果。

请注意 但是这仍处于 测试版发布状态 所以它还不会非常稳定。我们没有在 mysql 适配器上进行正确的外部联接调用,因此您将看到进行了三个查询,然后结果将在应用程序层的内存中联接。一旦标准解析器更新,这将被清理以执行单个 sql 查询,就像您期望的那样。

此外,每当您使用现有数据时,请确保您具有如下指定的 migrate: safe 标志,因此不会对当前数据库应用任何更改。

// Role.js
module.exports = {
identity : 'Role',
tableName : 'role_master',
migrate : 'safe',
schema : true,
autoPK : false,
autoCreatedAt : false,
autoUpdatedAt : false,

attributes: {

id : {
columnName : 'rolefk',
type : 'string',
required : true,
primaryKey : true,
unique : true,
uuidv4 : true
},

// A Role can have many permissions through the roleperm model
permissions : {
collection : 'permission',
through: 'roleperm'
}

}
};

// Permission.js
module.exports = {
identity : 'Permission',
tableName : 'perm_master',
migrate : 'safe',
schema : true,
autoPK : false,
autoCreatedAt : false,
autoUpdatedAt : false,

attributes : {

id : {
columnName : 'permfk',
type : 'string',
required : true,
primaryKey : true,
unique : true,
uuidv4 : true
},

// A Permission can belong to many roles using the roleperm model
roles : {
collection: 'role',
through: 'roleperm'
}

}

};

// RolePerm.js
module.exports = {
identity : 'RolePerm',
tableName : 'role_perm',
migrate : 'safe',
schema : true,
autoPK : false,
autoCreatedAt : false,
autoUpdatedAt : false,

attributes : {

// Due to a bug in the schema generator this seems to be needed at the
// model level but not on the actual database.
id: {
type: 'integer',
primaryKey: true
},

roleid : {
model: 'role',
columnName: 'role_id'
},

permid : {
model: 'permission',
columnName: 'perm_id'
}

}

};

关于sails.js - 使用现有连接表的一对多关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23795389/

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