TypeORM:有一对多和多对一关系时加入

时间:2018-07-26 11:30:46

标签: nestjs typeorm

@Entity()
export class User {
 @PrimaryColumn()
 id: string;

 @Column({unique: true})
 username: string;

 @Column({unique: true})
 email: string;

 @OneToMany(type => Post, post => post.id)
 posts: Post[];
}

@Entity()
export class Post {

 @PrimaryGeneratedColumn()
 id: number;

 @ManyToOne(type => User, user => user.posts)
 @JoinColumn({name: 'user_id'})
 user: User;

 @OneToMany(type => Image, image => image.id)
 images: Image[];
}

@Entity()
export class Image {
 @PrimaryGeneratedColumn()
 id: number;

 @ManyToOne(type => Post, post => post.images)
 @JoinColumn({name : 'post_id'})
 post: Post;
}

我有这3个实体,我想进行查询以获取用户的所有帖子,并获取该帖子的所有图像。我正在尝试使用以下代码进行此操作:

return await this.postRepository.createQueryBuilder("post")
  .innerJoinAndSelect("post.images", "image")
  .where("user_id = :userId", {userId: id})
  .getMany();

然后出现以下错误:

 "Cannot read property 'joinColumns' of undefined"

我也尝试过这个,而不是上面的innerJoin:

 .innerJoinAndSelect(Image, "image", "image.post_id = post.id")

这样,我不再收到该错误,但是结果是我仅收到该帖子,而无法从中获取图片

2 个答案:

答案 0 :(得分:5)

我自己一直在努力解决同样的问题。

您应该在此处更改关系:

@OneToMany(type => Image, image => image.id)
images: Image[];

对此:

@OneToMany(type => Image, image => image.post)
images: Image[];

请注意, image.id 应该是 image.post ,以匹配反面。

*编辑=> 在这里,出现了相同的问题:

@OneToMany(type => Post, post => post.id)
posts: Post[];

此关系还应具有相反的一面, post.id 应该是 post.user

@OneToMany(type => Post, post => post.user)
posts: Post[];

请注意这一点,因为它在运行时不会引发任何错误。

我刚刚通过上述修改测试了此查询,但错误消失了:

return await this.postRepository.find({
  relations: ['images', 'user'],
  where: { user: { id: id } },
});

您还可以省略 @JoinColumn()装饰器,因为在一对多多对一关系中它们不是必需的,您可以在官方文档中看到它:

  

您可以在@ManyToOne / @OneToMany关系中省略@JoinColumn。没有@ ManyToOne,@ OneToMany无法存在。如果要使用@OneToMany,则需要@ManyToOne。设置@ManyToOne的位置-它的相关实体将具有“关系ID”和外键。

有关此内容的更多详细信息,请参见TypeORM documentation,您还将找到这种关系的示例。

答案 1 :(得分:0)

@Entity()
export class User {

 @OneToMany(type => Post, post => post.user)
 posts: Post[];
}

@Entity()
export class Post {

 @PrimaryGeneratedColumn()
 id: number;

 @Column()
 user_id: number;

 @ManyToOne(type => User)
 @JoinColumn({name: 'user_id', referencedColumnName: 'id'})
 user: User;

 @OneToMany(type => Image, image => image.post)
 images: Image[];
}

@Entity()
export class Image {
 @PrimaryGeneratedColumn()
 id: number;

 @Column()
 post_id: number;

 @ManyToOne(type => Post)
 @JoinColumn({name : 'post_id', referencedColumnName: 'id'})
 post: Post;
}

尝试