PostgreSQL的复杂案例&x27;s案例操作员
我有一个搜索方法,用于在数据库中查找用户。用户可能会隐藏一些个人信息(负责此操作的设置称为PostgreSQL的复杂案例&x27;s案例操作员,postgresql,typeorm,Postgresql,Typeorm,我有一个搜索方法,用于在数据库中查找用户。用户可能会隐藏一些个人信息(负责此操作的设置称为profilePrivacyPermissions),例如电话号码、电子邮件。例如,如果用户的电子邮件是隐藏的,那么当通过电子邮件搜索时,该用户不应出现在搜索结果中 profilePrivacyPermissions对象是用户对象的一部分,如下所示: "profilePrivacyPermissions": [ { "screenType&q
profilePrivacyPermissions
),例如电话号码、电子邮件。例如,如果用户的电子邮件是隐藏的,那么当通过电子邮件搜索时,该用户不应出现在搜索结果中
profilePrivacyPermissions对象是用户对象的一部分,如下所示:
"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
}
]
此枚举定义了几种屏幕类型:
export enum EScreenType {
PHONE_NUMBER = 1,
EMAIL = 2,
PHOTO = 3,
TASKS_NOTES_FOLDERS = 4,
AUTO_ACCEPT_INVITES = 5,
}
以下是我用于此搜索的查询请求:
const users = await this.userRepository.createQueryBuilder('user')
.where(whereClause, filters)
.leftJoinAndSelect('user.subscription', 'subscription')
.leftJoinAndSelect('user.profilePrivacyPermissions', 'perms')
.limit(ESearchResponseEntityNumber.USERS)
.getMany();
和whereClause
如下所示:
const whereClause = `
(CASE perms.isEverybody WHEN true THEN
CASE perms.screenType
WHEN ${EScreenType.PHONE_NUMBER} THEN "user".phone ILIKE :searchTerm
WHEN ${EScreenType.EMAIL} THEN "user".profile_email ILIKE :searchTerm
END
END
OR "user".username ILIKE :searchTerm
) AND "user".id != :userId
`;
现在我需要根据以下逻辑修改此查询:
当TASKS\u NOTES\u文件夹
(其屏幕类型为4)为false时
用户不应出现在
搜索结果
以下是我的尝试(但无效):
const whereClause = `
(CASE
WHEN perms.isEverybody = true THEN
CASE perms.screenType
WHEN ${EScreenType.PHONE_NUMBER} THEN "user".phone ILIKE :searchTerm
WHEN ${EScreenType.EMAIL} THEN "user".profile_email ILIKE :searchTerm
END
WHEN perms.isNobody = true AND perms.screenType = ${EScreenType.TASKS_NOTES_FOLDERS} THEN NULL
END
OR "user".username ILIKE :searchTerm
) AND "user".id != :userId
`;