2017-05-02 113 views
1

私はちょうどTypeORMを使用して開始していると私は、次の関係が動作するようになって苦労しています。 getter、getFriends & getFriendsInverseは動作していますが、私は今、2つを区別したいと思います。言い換えると;私がmysql joinを実行するとき、私は友達とleftFriendsのleft joinをしたくありません。自己参照多対多の関係TypeORM

getter getFriends()は、私が使用しているオブジェクトの「側」に関係なく、すべてのフレンドを返す必要があります。

それは意味がありますか?

これは私のモデル定義です:

getFriends() { 
    // This method should also return inverseFriends; 
    // I do not want to return the concat version; this should 
    // happen on the database/orm level 
    // So I dont want: this.friends.concat(this.inverseFriends) 
    return this.friends; 
} 

@ManyToMany(type => User, user => user.friendsInverse, { 
    cascadeInsert: false, 
    cascadeUpdate: false, 
}) 
@JoinTable() 
friends = []; 

@ManyToMany(type => User, user => user.friends, { 
    cascadeInsert: true, 
    cascadeUpdate: true, 
    cascadeRemove: false, 
}) 
friendsInverse = []; 

私は誰かが私の質問を理解願っています:D おかげ マット

答えて

0

あなたはあなたの関係を自己参照することができます。ここに、単純な有向グラフの例があります(ノードは親と複数の子を持つことができます)。心に留めておくべき

@Entity() 
export class Service extends BaseEntity { 

    @PrimaryGeneratedColumn() 
    id: number; 

    @Column() 
    @Index({ unique: true }) 
    title: string; 

    @ManyToOne(type => Service, service => service.children) 
    parent: Service; 

    @OneToMany(type => Service, service => service.parent) 
    children: Service[]; 
} 

重要なノードは、これらの関係はfindxx機能をDBからオブジェクトを読み込むときにロードされ、自動ではないということです。

実際にロードするには、その時点でクエリビルダーを使用してそれらを結合する必要があります。 (あなたが複数のレベルに参加することができます。)例:

let allServices = await this.repository.createQueryBuilder('category') 
    .andWhere('category.price IS NULL') 
    .innerJoinAndSelect('category.children', 'product') 
    .leftJoinAndSelect('product.children', 'addon') 
    .getMany(); 

を私は(categoryproductaddon)、それらを参照するために別の名前を使用する方法に注意してください。

関連する問題