Как выбрать определенные столбцы в построителе запросов TypeORM (отношение «многие ко многим»)

#sql #postgresql #nestjs #typeorm #node.js-typeorm

Вопрос:

Я искал информацию и решения и не мог найти ничего, что соответствовало бы моей проблеме. Самым близким был этот вопрос [ https://stackoverflow.com/questions/64401212/how-to-select-specific-columns-in-typeorm-querybuilder?newreg=88f0c8cadd924456a61eddb8a5611421 ] и я использовал это как отправную точку.

Я использую PostgreSQL, и мои СУЩНОСТИ:

Сущность пользователя:

 @Entity('user') export class User {  @PrimaryGeneratedColumn()  id: number;   @CreateDateColumn({  type: 'timestamp',  default: () =gt; 'CURRENT_TIMESTAMP(6)',  })  createdAt: Date;   @CreateDateColumn({  type: 'timestamp',  default: () =gt; 'CURRENT_TIMESTAMP(6)',  onUpdate: 'CURRENT_TIMESTAMP(6)',  })  updatedAt: Date;   @ApiProperty()  @Column({ type: 'varchar', default: null })  name: string;   ..... more columns .......   @ManyToMany(() =gt; Calendar)  @JoinTable({  name: 'users_calendars',  joinColumn: {  name: 'idUser',  referencedColumnName: 'id',  },  inverseJoinColumn: {  name: 'idCalendar',  referencedColumnName: 'idCalendar',  },  })  calendars: Calendar[]; }  

Сущность календаря:

 @Entity('calendar') export class Calendar {  @PrimaryGeneratedColumn()  idCalendar: number;   @CreateDateColumn({  type: 'timestamp',  default: () =gt; 'CURRENT_TIMESTAMP(6)',  })  createdAt: Date;   @CreateDateColumn({  type: 'timestamp',  default: () =gt; 'CURRENT_TIMESTAMP(6)',  onUpdate: 'CURRENT_TIMESTAMP(6)',  })  updatedAt: Date;   @Column('varchar')  operation: string;   @Column('varchar', { nullable: true })  url?: string;   @Column('varchar', { nullable: true })  path?: string; }  

So, with this in mind I want to create a query that gets all the related calendars to a certain user.

I’ve been trying some raw SQL queries and what I want is something like this:

 SELECT   "calendar"."idCalendar",   "calendar"."operation",   "calendar"."url",   "calendar"."path"  FROM   "user" "user"  LEFT JOIN   "users_calendars" "user_calendar" ON "user_calendar"."idUser"="user"."id" LEFT JOIN   "calendar" "calendar" ON "calendar"."idCalendar"="user_calendar"."idCalendar"  WHERE   "user"."id" = 1 and (  "calendar"."operation" like '36454981858%' or   "calendar"."operation" like '%IVA%' or  "calendar"."operation" like '%condition 3%'  )  

This query works!!

What I’m doing with nestjs and typeorm is using this queryBuilder method like this:

 let queryCalendars = `"calendar"."operation" like '%IVA%' or "calendar"."operation" like '36454785616-914385082%' or "calendar"."operation" like '%IVA 3%' or "calendar"."operation" like '%IVA 4%'`;  const user: User = await this.connection  .getRepository(User)  .createQueryBuilder('user')  .leftJoinAndSelect('user.calendars', 'calendar')  .select([  'calendar.idCalendar',  'calendar.operation',  'calendar.url',  'calendar.path',  ])  .where(`user.id = :idUser and (${queryCalendars})`, { idUser })  .getOne();  

И создает этот запрос:

 SELECT   "calendar"."idCalendar" AS "calendar_idCalendar",   "calendar"."operation" AS "calendar_operation",   "calendar"."url" AS "calendar_url",   "calendar"."path" AS "calendar_path"  FROM   "user" "user"  LEFT JOIN   "users_calendars" "user_calendar" ON "user_calendar"."idUser"="user"."id"  LEFT JOIN   "calendar" "calendar" ON "calendar"."idCalendar"="user_calendar"."idCalendar"  WHERE   "user"."id" = :idUser and (  "calendar"."operation" like '%IVA%' or   "calendar"."operation" like '36454785616-914385082%' or   "calendar"."operation" like '%IVA 3%' or   "calendar"."operation" like '%IVA 4%'  )  

Этот запрос НЕ работает!!!!

Я схожу с ума, потому что не могу понять, в чем разница между этими запросами и почему я могу заставить их работать…

То, что я ожидаю получить, — это что-то вроде:

 [  {   idCalendar: 1,   operation: "operation-name",   url: "https://some.url",   path: "./some/path"   },  ... ]  

Но вместо этого я получаю неопределенность

Комментарии:

1. Я думаю , проблема в том, что он не читается idUser , попробуйте : user.id = ${idUser} ... и проверьте, правильно ли вы передали значение, ps : сначала проверьте статический идентификатор

2. @Youba Спасибо, но я уже пробовал это, и это не работает… Я думаю, что проблема может быть в части выбора, поэтому это единственная другая часть запросов