2016-04-07 12 views
1

In einer meiner Doctrine Record-Klassen, ich habe eine preSave Methode, die eine Überprüfung durchführt. Bei dieser Prüfung wird eine Abfrage für dieselbe Tabelle ausgeführt, zu der mein Datensatz gehört. Diese Abfrage ruft einen Datensatz aus der Tabelle ab, und ich verwende das hydrierte Ergebnis zum Vergleich mit dem aktuellen Datensatz, der von der Klasse dargestellt wird.Innerhalb einer Doctrine-Record-Klasse, die Abfrage für den gleichen Datensatz aus der DB überschreibt die Eigenschaften innerhalb der Klasse

In einigen Fällen ist das abgerufene hydrierte Ergebnis derselbe Datensatz wie der, mit dem ich arbeite, in der preSave Prüfung. Wenn dies geschieht, werden alle Änderungen, die ich an dem ersten Datensatz vorgenommen habe, jedoch rückgängig gemacht, sobald die Abfrage abgeschlossen ist.

Warum passiert das? Gibt es eine Problemumgehung?

Antwort

1

Doctrine behält möglicherweise einen einzelnen Verweis auf die Datensatzobjektinstanz bei und erstellt keine neue Instanz in Ihrer preSave() - Methode. Wenn das Objekt also hydratisiert ist, werden alle anderen Variablen desselben Typs in Ihrem Code "aktualisiert".

Um dies zu überprüfen, überprüfen Sie die Objekt-IDs der Variablen in Ihrem Code mit der Funktion spl_object_hash().

Code Ohne zu sehen, Abhilfe Vorschläge können variieren, aber eine mögliche Abhilfe ist ein Array in preSave(), um Hydrat:

$query = Doctrine_Query::create() 
->select('foo') 
->from('Bar b') 
->where('b.id = ?', $id); 

$results = $query->execute(array(), Doctrine::HYDRATE_ARRAY); 

Sie die Fähigkeit verlieren, wird das Ergebnis als ein Objekt zu verwenden, aber Sie kann den Inhalt des Arrays für Vergleiche verwenden.