#postgresql #nestjs #typeorm
#postgresql #nestjs #тип запроса
Вопрос:
const query = userConnection.getRepository(User).createQueryBuilder('user');
const result = await query.where("user.role @> ARRAY[:role]", { role: 'Super-Admin' })
.getMany();
return result;
Сущность
@Entity()
export class User extends BaseEntity{
@Column({type: 'text', array: true})
role: UserRole[];
}
Я получаю сообщение об ошибке «оператор не существует: текст @> текст []»
Что я здесь делаю не так?
Комментарии:
1. Как указано в ошибке, вы используете текст для сравнения с массивом, который postgresql не поддерживается. Вы хотите найти пользователя, у которого есть несколько ролей, кроме администратора?
2. Я хочу найти всех пользователей, у которых есть роль администратора. Пользователь может иметь несколько ролей, например {‘Администратор’, ‘Агентство’, ‘Студент’}
Ответ №1:
https://www.postgresql.org/docs/9.1/functions-comparisons.html
expression operator ANY (array expression)
Правая часть представляет собой заключенное в скобки выражение, которое должно давать
значение массива. Вычисляется левое выражение и сравнивается с
каждый элемент массива, использующий данный оператор, который должен выдавать
Логический результат. Результатом ЛЮБОГО является «true», если какой-либо истинный результат равен
получено. Результат равен «false», если не найден истинный результат (включая
случай, когда массив имеет нулевые элементы).
Таким образом, вы можете использовать ANY
функцию, чтобы найти, что у пользователя есть несколько ролей, содержащих администратора
const result = await query.where(':role = ANY (user.role)', { role: 'Super-Admin' });
Комментарии:
1. вот как я решил это query.andWhere(«:role = ANY ( string_to_array(user.role, ‘,’))», { роль });
Ответ №2:
Вот как я это решил
query.andWhere(":role = ANY ( string_to_array(user.role, ','))", { role });