2016-08-06 65 views
2

Ich habe 3 Doktrinsentitäten. Einer ist User, der zweite ist Product und der dritte ist ProductUsers. SoWie begrenzt man OneToMany/ManyToOne Assoziationen Tiefe/Schleife in Doctrine2?

, User haben OneToMany Verbindung mit ProductUsers und die gleichen Product haben OneToMany Verbindung mit ProductUsers. ProductUsers hat ManyToOne Assoziation mit beiden User und Product. Wie so:

class Product 
{ 
    /** 
    * @var ProductUsers 
    * 
    * @ORM\OneToMany(targetEntity="ProductUsers", mappedBy="product") 
    */ 
    private $productUsers; 
} 

class ProductUsers 
{ 
    /** 
    * @var Product 
    * 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Product", inversedBy="productUsers") 
    * @ORM\JoinColumn(name="product_ID", referencedColumnName="ID") 
    */ 
    private $product; 

    /** 
    * @var User 
    * 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="productUsers") 
    * @ORM\JoinColumn(name="user_ID", referencedColumnName="ID") 
    */ 
    private $user; 

    // extra fields ... 
} 

class User 
{ 
    /** 
    * @var ProductUsers 
    * 
    * @ORM\OneToMany(targetEntity="ProductUsers", mappedBy="user") 
    */ 
    private $productUsers; 
} 

Ein Benutzer kann mehrere Produkte verwenden und ein Produkt kann mehrere Benutzer haben. ProductUsers hat einige zusätzliche Informationen über die Beziehung als nur die Beziehung.

Das Problem ist, wenn ich ein User Objekt hole, kommt es mit verbundenen ProductUsers und es ist Product verbunden. Nicht nur das, aber die kommt auch mit allen es ist ProductUsers und es ist User Objekte, die ziemlich viel Aufwand ist.

This Frage bezieht sich eng auf mein Problem.

Ich versuche, das auf Doktrin-Ebene wie JMSSerializerBundle MaxDepth zu begrenzen. Gibt es eine Möglichkeit, diesen Overhead in der Doktrin zu begrenzen?

+0

So funktioniert Doctrine. Die Sammlung, die Sie erhalten, sollte faule Sammlungen sein, dh, nur wenn Sie auf die zugrunde liegenden Daten zugreifen, werden die tatsächlichen Daten aus der Datenbank abgerufen. Standardmäßig wird beim Abrufen eines Benutzers nur die Abfrage SELECT * FROM Benutzer ausgeführt. Um Datensätze auf einmal (nicht faul) zu holen, müssen Sie ihnen in einer ORM-Abfrage beitreten. Select: $ qb-> select ('u', 'up') – mblaettermann

Antwort

2

Ich konfrontiert dieses Problem lange zurück. Ich habe versucht lazy loading. Was nicht wie erwartet funktioniert hat und das war keine richtige Lösung für mein Problem. Also habe ich ein paar R & D gemacht und kam mit einer Lösung, die ich brauche keine bidirectional Beziehung von Product zu ProductUsers.

Ich kann die gleiche Beziehung mit unidirectional Handhabung nur von ProductUsers Seite verwalten. Sie benötigen One-To-Many Association, wenn Sie eine oder ähnliche Funktion benötigen. Ich schrieb auch eine small blog diesbezüglich.

Also, für Ihre Lösung, nur Many-To-One Assoziation von ProductUsers mit beiden und User Einheit. Sie brauchen keine Änderung in Ihrer Datenbankzuordnung.

Und wenn Sie Produkte für einen einzelnen Benutzer benötigen, können Sie immer eine Querybuilder in Repository zu verwenden, wenn Sie damit verbundene Daten benötigen.

Es wird eine Menge Leistung sparen. Ich hoffe es hilft!

+0

Vielen Dank @Jeet! Zurzeit löse ich das Problem mit 'DQL', um das einzige benötigte zu holen. Ich brauche auch "OneToMany" für den Fall, dass ich eine Liste von Produktbenutzern benötige oder umgekehrt, aber das macht das Problem hier so, dass benutzerdefinierte Abfragen der richtige Weg sind. 'OneToMany' ist fast nutzlos :( – Mehulkumar