web-dev-qa-db-ja.com

TypeORM:1対多および多対1の関係があるときに参加する

@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")

このようにして、そのエラーはもう発生しませんが、結果として投稿のみが取得され、そこから画像を取得できません

3
Darius Bogdan

私自身も同じ問題に取り組んでいます。

ここで関係を変更する必要があります。

@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.idpost.user代わりに:

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

実行時までエラーをスローしないため、これには注意してください。

上記の変更を加えてこのクエリをテストしたところ、エラーは発生しなくなりました。

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

@ JoinColumn()デコレータも省略できます。one to manyでは必要ないためです。 多対一の関係、公式ドキュメントで言及されていることがわかります:

@ManyToOne/@OneToManyリレーションでは@JoinColumnを省略できます。 @OneToManyは、@ ManyToOneなしでは存在できません。 @OneToManyを使用する場合は、@ ManyToOneが必要です。 @ManyToOneを設定した場所-その関連エンティティには「関係ID」と外部キーがあります。

これについての詳細は TypeORMドキュメント を参照してください。このタイプの関係の例も見つかります。

3
Martin Nieves
@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;
}

これを試して

1
user10225691