Тип массива запроса Typeorm в postgres

#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 });