如何使用.findAll并从两个不同的表和一个自引用中查找记录?

时间:2019-03-26 03:15:56

标签: mysql node.js database sequelize.js sequelize-cli

我正在特别处理两个表。用户和朋友。用户拥有大量定义用户的信息,而“朋友”除了ID之外还有两列:user_id和friend_id,这两个列都是对User表的引用。

我正在尝试在对数据库的尽可能少的调用中找到所有用户朋友,而我目前有2个。一个首先从请求中检索用户的ID,然后另一个从我的朋友那里比较来自第一个呼叫的ID,然后是第三个呼叫的ID,这些ID传递朋友数组并在Users表中找到所有ID。这已经感觉有些矫kill过正,我认为与协会建立联系必须有更好的方法。

不幸的是,不能修改表。

我从“ http://docs.sequelizejs.com/manual/querying.html#relations---associations”中看到的一件事

我尝试了一个错误,但是遇到了一个有趣的错误。.当尝试重新使用“关系/关联”下的链接中的代码段时,我得到“用户多次与朋友关联。要确定正确的关联,您必须使用'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 }
        },
      });

在我的用例中,以上工作有效。我只是想知道是否有办法减少对数据库的调用次数。

1 个答案:

答案 0 :(得分:0)

结果证明,如果您拥有适当的关联关系,Sequelize会为您处理此问题,因此,是的,这是一个衬里用户。对我而言,getFriends()。