@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")
这样,我不再收到该错误,但是结果是我仅收到该帖子,而无法从中获取图片
答案 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;
}
尝试