如何在 TypeORM postgres 中使用 leftJoinAndSelect 查询?
How to use leftJoinAndSelect query in TypeORM postgres?
我一直在使用 TypeORM 并制作了一些实体如下:
User.ts
@PrimaryGeneratedColumn()
id: number
Post.ts
@PrimaryGeneratedColumn()
id: number
@Column()
userId: number
因为我不想在 User
和 Post
实体之间建立关系,所以我只是在 Post
上创建了一个名为 userId
的列。
问题来了
我想连接两个表并获取数据。但是如何使用 innerJoinAndSelect
或 leftJoinAndSelect
?
这是我的代码:
// getPost.ts
// Attempt 1
const first = await createQueryBuilder()
.select('user')
.from(User, 'user')
.leftJoinAndSelect(Post, 'post', 'post.userId = user.id')
.getMany() // only fetched User data without Post data
// Attempt 2
const second = await createQueryBuilder('user')
.innerJoinAndSelect('user.id', 'userId')
.innerJoinAndMap('user.id', Post, 'post', 'userId = post.userId')
.getMany() // Bad request error
但其中 None 有效...
我想加入 User
和 Post
并获取所有数据(但不使用关系)。我怎样才能得到这些数据?
由于不想在数据库中创建外键关系,但又想对实体进行连接操作,可以在关系选项中使用createForeignKeyConstraints
属性做到这一点。
如下更新您的实体:
User.ts
@PrimaryGeneratedColumn()
id: number
@OneToMany(() => Post, (post) => post.user)
posts: Post[]
Post.ts
@PrimaryGeneratedColumn()
id: number
@Column()
userId: number
@ManyToOne(() => User, (user) => user.posts, { createForeignKeyConstraints: false })
@JoinColumn({ name: 'userId' })
user: User
现在您应该可以对这些实体使用 find
或 QueryBuilder
方法,就像它们在数据库中具有实际关系一样。
我没有测试这段代码,但这是你应该做的事情的本质。希望这可以帮助。干杯!!!
leftJoinAndMapOne
应该可以。但是你刚刚省略了第一个参数 mapToProperty
.
把你的getPost.ts
改成这样
const first = await createQueryBuilder()
.select(‘user’)
.from(User, ‘user’)
// ------------------------ fixed ------------------------
.leftJoinAndMapOne(‘user.id’, Post, ‘post’, ‘post.userId = user.id’)
// -------------------------------------------------------
.getMany()
我一直在使用 TypeORM 并制作了一些实体如下:
User.ts
@PrimaryGeneratedColumn() id: number
Post.ts
@PrimaryGeneratedColumn() id: number @Column() userId: number
因为我不想在 User
和 Post
实体之间建立关系,所以我只是在 Post
上创建了一个名为 userId
的列。
问题来了
我想连接两个表并获取数据。但是如何使用 innerJoinAndSelect
或 leftJoinAndSelect
?
这是我的代码:
// getPost.ts
// Attempt 1
const first = await createQueryBuilder()
.select('user')
.from(User, 'user')
.leftJoinAndSelect(Post, 'post', 'post.userId = user.id')
.getMany() // only fetched User data without Post data
// Attempt 2
const second = await createQueryBuilder('user')
.innerJoinAndSelect('user.id', 'userId')
.innerJoinAndMap('user.id', Post, 'post', 'userId = post.userId')
.getMany() // Bad request error
但其中 None 有效...
我想加入 User
和 Post
并获取所有数据(但不使用关系)。我怎样才能得到这些数据?
由于不想在数据库中创建外键关系,但又想对实体进行连接操作,可以在关系选项中使用createForeignKeyConstraints
属性做到这一点。
如下更新您的实体:
User.ts
@PrimaryGeneratedColumn()
id: number
@OneToMany(() => Post, (post) => post.user)
posts: Post[]
Post.ts
@PrimaryGeneratedColumn()
id: number
@Column()
userId: number
@ManyToOne(() => User, (user) => user.posts, { createForeignKeyConstraints: false })
@JoinColumn({ name: 'userId' })
user: User
现在您应该可以对这些实体使用 find
或 QueryBuilder
方法,就像它们在数据库中具有实际关系一样。
我没有测试这段代码,但这是你应该做的事情的本质。希望这可以帮助。干杯!!!
leftJoinAndMapOne
应该可以。但是你刚刚省略了第一个参数 mapToProperty
.
把你的getPost.ts
改成这样
const first = await createQueryBuilder()
.select(‘user’)
.from(User, ‘user’)
// ------------------------ fixed ------------------------
.leftJoinAndMapOne(‘user.id’, Post, ‘post’, ‘post.userId = user.id’)
// -------------------------------------------------------
.getMany()