我一直在使用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
但是这些都不起作用…
我想加入User
与Post
和抓取所有数据(但不使用关系)。我怎么能得到这些数据呢?
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
现在你应该能够在这些实体上使用find
或QueryBuilder
方法,就像它们在数据库中有实际的关系一样。
我没有测试这段代码,但这是你应该做的本质。希望这对你有所帮助。干杯🍻!!