#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 Спасибо, но я уже пробовал это, и это не работает… Я думаю, что проблема может быть в части выбора, поэтому это единственная другая часть запросов