【发布时间】:2020-12-31 16:33:46
【问题描述】:
我正在编写一个用户搜索方法,它应该通过电话号码、电子邮件和用户名搜索用户。问题是用户可以隐藏他们的电话号码和电子邮件。 因此,如果他们确实将其隐藏在应用程序的隐私设置中,则不应将其列在搜索结果中。
我正在使用 typeorm 来构建这个搜索查询,这就是我的尝试 如果不存在隐藏个人信息的要求:
const whereClause = `
(
"user".phone ILIKE :searchTerm
OR "user".username ILIKE :searchTerm
OR "user".profile_email ILIKE :searchTerm
) AND "user".id != :userId
`;
const users = await this.userRepository.createQueryBuilder('user')
.where(whereClause, filters)
.leftJoinAndSelect('user.subscription', 'subscription')
.leftJoinAndSelect('user.profilePrivacyPermissions', 'perms')
.limit(ESearchResponseLimit.USERS)
.getMany();
个人资料隐私表如下所示:
屏幕类型 1 对应于电话号码,2 对应于电子邮件。目前我们只考虑两种可能的状态:isEverybody 和isNobody(我们不考虑联系人)。因此,例如,如果用户决定隐藏他的电话号码,则 isNobody 值将等于 true,其他值将设置为 false。
我需要在我正在构建的搜索查询中以某种方式考虑这些隐私设置。应该是这样的:
const whereClause = `
(
("user".phone ILIKE :searchTerm IF (perms.screenType = ${EScreenType.PHONE_NUMBER} AND perms.isEverybody))
OR "user".username ILIKE :searchTerm
OR ("user".profile_email ILIKE :searchTerm IF (perms.screenType = ${EScreenType.EMAIL} AND perms.isEverybody))
) AND "user".id != :userId
`;
问题是没有IF这样的运营商,但我的想法是如果它没有隐藏我需要通过电话搜索,如果它也没有隐藏我需要通过电子邮件搜索。对于如何在查询中实现这一点,我什至想不出一个遥远的想法。
如果可以使用原始查询,那也很好。
我发现 PostgreSQL 中有 IF 运算符,但我不知道如何在这里使用它。
编辑:
如果我在隐藏电子邮件时通过电话搜索(这意味着对于电子邮件屏幕perms.isEverybody = false),用户对象的 profilePrivacyPermissions 字段如下所示:
"profilePrivacyPermissions": [
{
"screenType": 1,
"isEverybody": true,
"isContacts": false,
"isNobody": false
}
]
但它应该如下所示:
"profilePrivacyPermissions": [
{
"screenType": 1,
"isEverybody": true,
"isContacts": false,
"isNobody": false
},
{
"screenType": 2,
"isEverybody": false,
"isContacts": false,
"isNobody": true
},
{
"screenType": 4,
"isEverybody": true,
"isContacts": false,
"isNobody": false
},
{
"screenType": 5,
"isEverybody": true,
"isContacts": false,
"isNobody": false
},
{
"screenType": 3,
"isEverybody": true,
"isContacts": false,
"isNobody": false
}
]
我知道这是因为查询的 where 子句中的 perms 条件。
【问题讨论】:
-
使用布尔假人。优化器会理解:例如
WHERE ( :ignore_xclause OR field ILIKE :xfield) ...为 :gnore_xclause 使用 True 这将被优化。 -
@wildplasser mmm 不确定我是否理解正确。你能写一个更详细的例子吗?
-
我添加了一个答案来说明。
标签: node.js postgresql typeorm