【发布时间】:2019-03-26 03:15:56
【问题描述】:
我正在使用两张桌子。用户和朋友。 Users 有一堆定义 User 的信息,而 Friends 除了 id 之外还有两列:user_id 和friend_id,它们都是对 User 表的引用。
我试图在尽可能少的调用数据库中找到所有用户的朋友,我目前有 2 个。一个首先从请求中检索用户的 id,然后另一个到我比较的朋友第一次调用的 ID,然后是第三次调用的 ID,它传递朋友数组并在用户表中找到所有这些人。这已经感觉有点过头了,我认为有了关联,必须有更好的方法。
很遗憾,不能修改表格。
我从“http://docs.sequelizejs.com/manual/querying.html#relations---associations”看到的一件事
我尝试过,但遇到了一个有趣的错误。当尝试重新利用关系/关联下链接中的代码 sn-p 时,我得到“用户与朋友多次关联。要识别正确的关联,您必须使用'as' 关键字来指定要包含的关联的别名。"
const userRecord = await User.findOne({
where: { id }
})
const friendsIDs = await Friends.findAll({
attributes: ["friend_id"],
where: {
user_id: userRecord.id
}
}).then(results => results.map(result => result.friend_id));
const Sequelize = require("sequelize");
const Op = Sequelize.Op;
return await User.findAll({
where: {
id: { [Op.in]: friendsIDs }
},
});
以上适用于我的用例。我只是想知道是否有办法减少对数据库的调用次数。
【问题讨论】:
-
你为什么要调用这个查询,因为你已经有了用户 ID。 const userRecord = await User.findOne({ where: { id } }) 您是否尝试在朋友表上使用 join,如果是,请提及您使用的查询?您是否在朋友表中添加了 user_id 和friend_id 作为外键?
-
为什么不使用原始 SQL 查询?因为您的要求不需要最终 findAll 的任何关联数据。 SELECT * FROM users where id IN (Sub QUERY)。即使不想完全使用原始 SQL,也可以使用 - where: Sequelize.literal("(Sub Query)");
-
@PankajJindal 是的 user_id 和friend_id 是朋友表中的外键。我不确定我是否理解这种混乱。前端调用特定的后端端点并传递 user_id 来搜索好友
-
@user3026715 您的问题已解决还是您仍然面临?
-
事实证明,如果你有适当的关联,Sequelize 会为你处理这个问题,所以是的,它对我来说是一个单行 user.getFriends()。
标签: mysql node.js database sequelize.js sequelize-cli