sql - 如何在 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: () => 'CURRENT_TIMESTAMP(6)',
})
createdAt: Date;
@CreateDateColumn({
type: 'timestamp',
default: () => 'CURRENT_TIMESTAMP(6)',
onUpdate: 'CURRENT_TIMESTAMP(6)',
})
updatedAt: Date;
@ApiProperty()
@Column({ type: 'varchar', default: null })
name: string;
..... more columns .......
@ManyToMany(() => 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: () => 'CURRENT_TIMESTAMP(6)',
})
createdAt: Date;
@CreateDateColumn({
type: 'timestamp',
default: () => '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;
}
因此,考虑到这一点,我想创建一个查询,将所有相关日历发送给某个用户。
我一直在尝试一些原始 SQL 查询,我想要的是这样的:
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 '%1636454981858%' or
"calendar"."operation" like '%IVA%' or
"calendar"."operation" like '%condition 3%'
)
这个查询有效!!
我正在使用 nestjs 和 typeorm 使用这个 queryBuilder 方法,如下所示:
let queryCalendars = `"calendar"."operation" like '%IVA%' or "calendar"."operation" like '%1636454785616-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 '%1636454785616-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"
},
...
]
但相反,我得到了未定义的......
解决方案
推荐阅读
- python - 学习烧瓶:jinja2.exceptions.TemplateSyntaxError:预期的令牌'name',得到'.'
- sql - 行粒度操作/错误处理
- wpf - chrome 更新后 CEF Sharp 远程调试无法正常工作(80.0.3987.116)
- node.js - Firebase 消息推送通知
- python - 添加到 crm 的布尔字段未保存
- python - GoDaddy MySQL 表未收到我的插入/更新请求
- mysql - 如何在 DolphinDB 表中获取一些记录,如 mysql 的限制
- git - TFVS 上的 TFS 合并冲突
- python - 重新保存上传的文件影响文件格式 - 烧瓶
- typescript - window.openDatabase 不是moodle 3.8 Ionic 应用程序中的函数错误