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



我一直在使用TypeORM,并做了一些实体如下:

  • User.ts

    @PrimaryGeneratedColumn()
    id: number
    
  • Post.ts

    @PrimaryGeneratedColumn()
    id: number
    @Column()
    userId: number
    

由于我不想把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

但是这些都不起作用…

我想加入UserPost和抓取所有数据(但不使用关系)。我怎么能得到这些数据呢?

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

把你的getPost.ts修改成这个

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

由于您不想在数据库中创建外键关系,但仍然希望对实体使用连接操作,因此您可以使用关系选项中的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方法,就像它们在数据库中有实际的关系一样。


我没有测试这段代码,但这是你应该做的本质。希望这对你有所帮助。干杯🍻!!

相关内容

  • 没有找到相关文章

最新更新