2017-05-02 6 views
1

Ich habe mit TypeORM gerade erst begonnen und ich bin zu kämpfen, die folgende Beziehung erhalten zu arbeiten:selbst verweis ManyToMany Beziehung TypeORM

User-> Freunde, während ein Freund ist auch ein Benutzerobjekt. Meine Getter, getFriends & getFriendsInverse funktionieren jedoch; Ich möchte jetzt zwischen den beiden unterscheiden. Mit anderen Worten; Wenn ich einen mysql-Join mache, möchte ich keinen Link bei Freunden und einen bei InverseFriends machen.

Der Getter getFriends() muss alle Freunde zurückgeben, egal auf welcher "Seite" ich bin.

Macht das Sinn?

Das ist meine Bestimmung des Modells:

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 = []; 

Ich hoffe jemand versteht meine Frage: D Dank Matt

Antwort

0

Sie können Ihre Beziehungen Selbstreferenz. Hier ist ein Beispiel für ein einfaches gerichtetes Diagramm (aka ein Knoten hat einen Elternteil und mehrere Kinder).

@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[]; 
} 

Ein wichtiger Knoten im Auge zu behalten ist, dass diese Beziehungen nicht automatisch geladen wird, wenn von der DB mit findxx Funktionen Lesen eines Objekts.

Um sie tatsächlich zu laden, müssen Sie im Moment Query Builder verwenden und sich ihnen anschließen. (Sie können mehrere Ebenen verbinden.) Ein Beispiel:

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

Bitte beachten Sie, wie ich verschiedene Namen verwendet, um sie zu referenzieren (category, product und addon).

Verwandte Themen