如何使用 .findAll 并从两个不同的表和一个自引用中查找记录?
How to use .findAll and find records from two different tables and a self reference?
我正在与两个 table 合作。用户和朋友。 Users 有一堆定义 User 的信息,而 Friends 除了 id 之外还有两列:user_id 和 friend_id,其中它们都是对 User table.[=12= 的引用]
我试图通过尽可能少地调用数据库来找到所有用户的朋友,我目前有 2 个。一个首先从请求中检索用户的 ID,然后另一个是我的朋友比较第一次调用的 ID,然后是传递朋友数组的第三次调用,并在用户 table 中找到所有这些 ID。这已经感觉有点矫枉过正了,我认为对于协会,必须有更好的方法。
不幸的是,修改 tables 不是一个选项。
我从“http://docs.sequelizejs.com/manual/querying.html#relations---associations”看到的一件事
我尝试了,但遇到了一个有趣的错误。当我尝试重新调整 Relations/Associations 下 link 中的代码片段时,我得到 "user is associated to friends multiple times. To identify the correct association, you must use the 'as' keyword to specify the alias of the association you want to include."
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 }
},
});
以上适用于我的用例。我只是想知道是否有办法减少对数据库的调用次数。
事实证明,如果您有适当的关联,Sequelize 会为您处理这个问题,所以是的,它对我来说是一个单行 user.getFriends()。
我正在与两个 table 合作。用户和朋友。 Users 有一堆定义 User 的信息,而 Friends 除了 id 之外还有两列:user_id 和 friend_id,其中它们都是对 User table.[=12= 的引用]
我试图通过尽可能少地调用数据库来找到所有用户的朋友,我目前有 2 个。一个首先从请求中检索用户的 ID,然后另一个是我的朋友比较第一次调用的 ID,然后是传递朋友数组的第三次调用,并在用户 table 中找到所有这些 ID。这已经感觉有点矫枉过正了,我认为对于协会,必须有更好的方法。
不幸的是,修改 tables 不是一个选项。
我从“http://docs.sequelizejs.com/manual/querying.html#relations---associations”看到的一件事
我尝试了,但遇到了一个有趣的错误。当我尝试重新调整 Relations/Associations 下 link 中的代码片段时,我得到 "user is associated to friends multiple times. To identify the correct association, you must use the 'as' keyword to specify the alias of the association you want to include."
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 }
},
});
以上适用于我的用例。我只是想知道是否有办法减少对数据库的调用次数。
事实证明,如果您有适当的关联,Sequelize 会为您处理这个问题,所以是的,它对我来说是一个单行 user.getFriends()。