Sails.js 使用现有联接表的一对多关联

Sails.js 使用现有联接表的一对多关联,sails.js,Sails.js,我正在转换一个现有应用程序的后端,该应用程序使用MariaDB来使用Sails(v0.10.0-rc7),并且我一直在试图找出如何获得填充到角色模型中的角色的所有权限,因为我必须使用底层架构结构 当前有三个表用于获取角色及其关联权限,工作查询如下所示: SELECT pm.permission, pm.permkey FROM role_master rm INNER JOIN role_perm rp ON ( rm.roleid = rp.roleid ) INNER JOIN perm_m

我正在转换一个现有应用程序的后端,该应用程序使用MariaDB来使用Sails(v0.10.0-rc7),并且我一直在试图找出如何获得填充到角色模型中的角色的所有权限,因为我必须使用底层架构结构

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

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\u master
中有角色定义,在
role\u perm
中有每个角色的单独权限,最后是
perm\u master
中的权限定义

我读过关于联想的书,但我没有看到任何对我有帮助的东西

理想情况下,我希望最终得到的是一个输出以下内容的榜样:

{
  "id"          : 1,
  "name"        : "My Role Name",
  "description" : "My Role Description",
  "permissions" : [ 'canread', 'canwrite', 'canjump', 'canplay' ]
}

在不修改基础数据库的情况下实现这一点的最佳方法是什么?

Waterline的一个优点是能够将模型映射到自定义表名和列名。但是,目前对于自动生成的联接表,我们还没有一个很好的方法来实现这一点。我的早期作品之一是通过关联创建
。这些基本上允许您构建一个用作联接表的模型。我们后来决定,这基本上只是一个嵌套的填充,但对于这样的用例,我将
逻辑留在了那里

您不能向through表中添加其他属性,但是如果您为join表映射了这两个值,那么查询和蓝图路由将正常工作。现在有一个关于through表所需主键值的小说明,但这只是schema builder中的一个bug,应该很快解决

下面的逻辑目前没有文档记录,但可以帮助您获得所需的结果

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

此外,无论何时处理现有数据,请确保启用了下面指定的
migrate:safe
标志,以便不对当前数据库应用任何更改

//Role.js
module.exports={
身份:'角色',
tableName:“角色\主机”,
迁移:“安全”,
图式:对,
错,
自动创建数据:false,
自动更新日期:false,
属性:{
身份证:{
columnName:'rolefk',
键入:“字符串”,
要求:正确,
primaryKey:没错,
独一无二:没错,
uuidv4:正确
},
//通过roleperm模型,角色可以拥有许多权限
权限:{
集合:“权限”,
通过:“角色扮演”
}
}
};
//Permission.js
module.exports={
标识:“权限”,
tableName:“perm_master”,
迁移:“安全”,
图式:对,
错,
自动创建数据:false,
自动更新日期:false,
属性:{
身份证:{
columnName:'permfk',
键入:“字符串”,
要求:正确,
primaryKey:没错,
独一无二:没错,
uuidv4:正确
},
//使用roleperm模型,权限可以属于多个角色
角色:{
集合:“角色”,
通过:“角色扮演”
}
}
};
//RolePerm.js
module.exports={
标识:'RolePerm',
tableName:“角色\u perm”,
迁移:“安全”,
图式:对,
错,
自动创建数据:false,
自动更新日期:false,
属性:{
//由于模式生成器中存在一个错误,因此在
//模型级别,但不在实际数据库上。
身份证:{
键入:“整数”,
primaryKey:对
},
罗莱德:{
模型:“角色”,
columnName:“角色\u id”
},
许可证:{
模型:“权限”,
columnName:“perm_id”
}
}
};

我只是想澄清一下,您是想使用当前的适配器(例如mysql)来建立具有关联的模型,还是想用现有的MariaDB数据库来建立模型?我正试图使用sails mysql适配器来构建一组模型,最终输出上面包含的最终JSON结果。很抱歉造成混淆。明白了,请发布这三个模型(不要担心关联),或者如果你想发布一个链接到你的回购协议,我可以看看。另外,我还有一些关于我一直在研究的关联的文档可以找到。首先,(现在意识到你是谁)你是我决定将Sails作为REST后端框架的原因。你的帆船赛太棒了。不管怎么说,够了,这里是我的三个模型,我正努力让它们配合得很好:太棒了。非常感谢。几个小时来,我一直在努力让它发挥作用!!:)@梅尔文,试试这个: