【问题标题】:How to use .findAll and find records from two different tables and a self reference?如何使用 .findAll 并从两个不同的表和一个自引用中查找记录?
【发布时间】: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


【解决方案1】:

如果你有适当的关联,Sequelize 会为你处理这个问题,所以是的,对我来说这是一个单行 user.getFriends()。

【讨论】:

    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多