使用 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 join
和 where
子句替换为 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);
});
我正在尝试使用 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 join
和 where
子句替换为 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);
});