我正在尝试显示多对多关联,但我尝试的所有内容都返回undefined。我基本上试图做这个人在这里问Sails.js Associations many-to-many relation 但他没有回应。我正在使用postgres,但我认为不重要。
我可以看到创建的额外表来链接这两个实体。基本上我有一个用户,组,角色模型。用户拥有多个组和角色。当我查看表时,User模型实际上不包含group.name或role.name之类的信息,并且创建的关系表仅包含引用该关联的id号。我假设我需要在关联表中找到用户ID与我当前用户ID匹配的所有角色并显示它们。
有两个问题,有没有其他方法可以显示相关记录而无需通过id查询。所以user.roles.name(例如)。或者如何将角色/组名称添加到由sails创建的实际关联表中,而不仅仅显示id号。
用户模型
module.exports = {
attributes: {
username: 'string',
password: 'string',
firstname: 'string',
lastname: 'string',
email: 'string',
group: {
collection: 'groups',
via: 'users',
dominant: true
},
roles: {
collection: 'role',
via: 'users',
dominant: true
}
}
};
群组模型
module.exports = {
attributes: {
name: 'string',
users: {
collection: 'user',
via: 'group'
}
}
};
角色模型
module.exports = {
attributes: {
name: 'string',
users: {
collection: 'user',
via: 'roles'
}
}
};
感谢您的帮助!
修改
ejs文件
<table>
<tr>
<th>ID</th>
<th>Username</th>
<th>First Name</th>
<th>Last Name</th>
<th>Email</th>
<th>Groups</th>
<th>Roles</th>
</tr>
<% users.forEach(function(user){ %>
<tr>
<td><%= user.id %></td>
<td><%= user.username %></td>
<td><%= user.firstname %></td>
<td><%= user.lastname %></td>
<td><%= user.email %></td>
<td><%= user.group.collection %></td>
<td><%= user.roles.collection %></td>
<td><a href="/user/edit/<%= user.id%>">Edit</a></td>
</tr>
<% }); %>
</table>
UserController中:
users: function(req, res) {
User.find().exec(function(err, users){
res.view({users: users});
});
},
我尝试了很多不同的user.roles和user.group变体。我猜这是完全错误但是没有找到关于其他任何东西的文档,只是建立了多对多的关系。
答案 0 :(得分:2)
在查询用户时,您需要填充关联,如documentation for many-to-many associations中所示。
User.find()
.populate('group')
.populate('roles')
.exec(function(err, users){...}
OR
User.find().populateAll().exec(function(err, users){...}
其中任何一个都会向每个用户添加group
数组和roles
数组。因此,如果您保持视图代码不变,那么您可能只需获得[Object object]
这两列的输出。您可以使用Lodash至少创建以逗号分隔的名称列表。例如:
<td><%= _.pluck(user.group.collection, 'name').join(', ') %></td>
将为您提供用户所属的组列表。默认情况下,Lodash由Sails全球化,因此您不必为项目添加任何内容以使其工作。
.populate
的完整文档为here。