getReference () des Doktrin Entity Manager

8

Situation:

Ich möchte die getReference () Funktion der Doktrin2 Entity Manager. In einer Situation, in der ich nach einem Objekt frage, das aus der Datenbank gelöscht wurde, erhalte ich einen Proxy, wenn ich das gleiche Objekt mehr als einmal anfrage.

Ein Beispiel:

%Vor%

Die Ausgabe:

%Vor%

Wie kann ich einen Proxy für ein Objekt erhalten, das nicht einmal in der Datenbank existiert? Wenn ich diese Zeile kommentiere, verwaltet der entityManager nicht Objekt und ich bekomme die Ausgabe abab , was mir mehr Sinn macht, da ich kein Proxy-Objekt bekommen möchte, das nicht in der Datenbank existiert. Für Informationen hat das zurückgegebene Proxy-Objekt alle seine Eigenschaften null . Ich erhalte daher einen Proxy für ein Objekt, das nicht in der Datenbank existiert. Also, wenn ich nach diesem Objekt frage bekomme ich eine "Not found Entity" Ausnahme.

Die Herausforderung

Kann irgendjemand etwas davon verstehen? Gibt es eine Möglichkeit, sich auf getReference() zu verlassen, um uns mitzuteilen, ob dieses Objekt tatsächlich in der Datenbank existiert?

    
Mick 09.05.2013, 06:51
quelle

2 Antworten

19

Es ist nicht möglich, getReference() zu veranlassen, die Datenbank auf das Vorhandensein des referenzierten Objekts zu überprüfen.

Genau das ist es, was getReference() und die von ihm zurückgegebenen Proxies sind: Erstellen von Platzhalter-Objekten (Proxies), ohne in die Datenbank zu gehen. Und das würden Sie nur selten explizit tun wollen. Normalerweise führt Doctrine dies intern durch, wenn Entitäten hydratisiert werden, um basierend auf Fremdschlüsselwerten Lazy-Loading-Platzhalter für verwandte Entitäten zu erstellen.

Warum rufst du nicht einfach find() im Entity Manager an? Ist Ihnen bewusst, dass der EM die Datenbank für dasselbe Objekt mehr als einmal abfragt, solange Sie nach ID suchen? Doctrine verfolgt bereits hydrierte Objekte in der Arbeitseinheit und gibt Verweise auf die vorhandenen Objekte in nachfolgenden find() -Aufrufen zurück.

    
literal 04.06.2013, 20:15
quelle
0

Wenn Sie getReference verwenden, um ein Objekt zu erhalten, aber dann eine Methode wie getName aufrufen, holt Doctrine die Entität aus der DB. Es gibt keine andere Möglichkeit, die Eigenschaft herauszufinden (getName).

In Bezug auf Ihre Herausforderung:

EntityManager->contains($entity) wäre die bevorzugte Methode, um zu überprüfen, ob sich die Entität aus der Doktrin im Entity Manager befindet.

    
Andrew Atkinson 16.10.2015 09:58
quelle

Tags und Links