使用 knex 查询按关系过滤项目

Filtering items by relation using knex query

我正在尝试使用 knex 查询按关系过滤项目。我快到了(我想)但有点挣扎,需要一些帮助,因为这对我来说是新的。

我有一个正在关注并拥有关注者的用户列表。我正在尝试 return 我尚未关注的用户列表。以下是我目前的代码:

const users = await knex("users-permissions_user").whereNotExists(
  function () {
    this.select("*")
      .from("users_followers__users_followings")
      .where("user_id", "users-permissions_user.id")
      .where("follower_id", id);
  }
);

此 return 是当前没有关注者和我是唯一关注者的用户的列表。我关注并且拥有更多关注者的任何用户仍然 returned。我以为 like 会实现这种类型的过滤器,但我一定是做错了。

下面是 followers/following 关系的 table 在我的数据库中的显示方式:

这是从上述查询中 return 编辑的数据:

[
  {
    "id": "138",
    "followers": [
      {
        "id": "143"
      }
    ]
  },
  {
    "id": "140",
    "followers": [
      {
        "id": "160"
      },
      {
        "id": "136"
      }
    ]
  },
  {
    "id": "135",
    "followers": []
  },
  {
    "id": "136",
    "followers": []
  }
]

如您所见,没有关注者的用户和我尚未关注的用户一样被 return 关注,但拥有多个关注者的用户,包括我 (ID 160),是return在应该省略的时候编辑。

如有任何建议,我们将不胜感激!

所以像 140 这样的用户即使在关注您 (160) 的情况下也会被 returned 的原因是因为他们至少关注了另一个人t you,这意味着你的 where 子句将匹配它们。 如果您只想 return 不关注您的用户,您可以通过将 left joinwhere 子句替换为 where not exists 子句来实现。在 knex 中看起来像:

qb.whereNotExists(function() {
     this.select(1)
    .from('users_followers__users_followings')
    .where('users_followers__users_followings.user_id', knex.ref('users-permissions_user.id'))
    .where('users_followers__users_followings.follower_id', id);
});