如何在 TypeORM postgres 中使用 leftJoinAndSelect 查询?

How to use leftJoinAndSelect query in TypeORM postgres?

我一直在使用 TypeORM 并制作了一些实体如下:

因为我不想在 UserPost 实体之间建立关系,所以我只是在 Post 上创建了一个名为 userId 的列。

问题来了

我想连接两个表并获取数据。但是如何使用 innerJoinAndSelectleftJoinAndSelect

这是我的代码:

// 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 有效...

我想加入 UserPost 并获取所有数据(但不使用关系)。我怎样才能得到这些数据?

由于不想在数据库中创建外键关系,但又想对实体进行连接操作,可以在关系选项中使用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

现在您应该可以对这些实体使用 findQueryBuilder 方法,就像它们在数据库中具有实际关系一样。


我没有测试这段代码,但这是你应该做的事情的本质。希望这可以帮助。干杯!!!

leftJoinAndMapOne 应该可以。但是你刚刚省略了第一个参数 mapToProperty.

把你的getPost.ts改成这样

const first = await createQueryBuilder()
  .select(‘user’)
  .from(User, ‘user’)
  // ------------------------ fixed ------------------------
  .leftJoinAndMapOne(‘user.id’, Post, ‘post’, ‘post.userId = user.id’)
  // -------------------------------------------------------
  .getMany()