2017-05-02 159 views
1

使用TypeORM我剛開始和我掙扎得到以下關係的工作:自引用多對多關係TypeORM

用戶 - >朋友,而朋友也是一個用戶對象。 然而,我的getters,getFriends & getFriendsInverse正在工作;我現在想區分這兩者。換一種說法;當我執行mysql連接時,我不想在inverseFriends上對朋友和另一個朋友進行左連接。

getter getFriends()需要返回所有的朋友,而不管我所在的對象是哪個「side」。

這有道理嗎?

這是我的模型定義:

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功能,這些關係不是自動加載。

要實際加載它們,您必須使用查詢構建器並加入它們。 (您可以加入多個級別。)一個例子:

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

請注意我是如何利用不同的名稱來引用它們(categoryproductaddon)。