2013-10-23 3 views
7

Ich baue ein Symfony2-Projekt und verwende gedmo/doctrine-extensions (GitHub), um Softdelete zu implementieren. Meine Frage ist, ob es eine Möglichkeit gibt, Softdelete "zu deaktivieren" oder "zu überschreiben" oder sogar zu erkennen, wenn etwas weich gelöscht wurde.Symfony2/Doctrine: Lesen von "gelöschten" Daten bei Verwendung von Gedmos Doktrinserweiterungen

Hier ist die Situation:

ich eine „Notiz“ Einheit haben, die eine „user“ Entität verweist. Eine bestimmte Notiz verweist auf einen Benutzer, der gelöscht wurde. Obwohl der Benutzer gelöscht wurde, gibt er für die Logik "ist definiert" von TWIG den Wert true zurück und kann sogar die ID des gelöschten Benutzers zurückgeben. Wenn ich jedoch nach anderen Informationen abfrage (einschließlich des Parameters "deletedAt", der angibt, ob er gelöscht wurde oder nicht), erhalte ich den Fehler 500 "Entity wurde nicht gefunden".

Da tatsächlich die Daten immer noch da, und da die Notiz selbst nicht gelöscht, würde ich immer noch sagen, wer den Zettel geschrieben hat, auch wenn der Benutzer gelöscht wurde.

Ist das möglich? Wenn nicht, wie erkenne ich richtig, ob etwas weich gelöscht wurde? Wie gesagt, $note->getUser() ruft immer noch ein Objekt ab und gibt für alle Null/"ist definiert" Vergleiche wahr zurück.

+0

Dies ist eine bekannte Einschränkung von Doctrine2 finden https://github.com/doctrine/doctrine2/issues/4543 – PowerKiKi

Antwort

6

Sie benötigen die Beziehung Laden zu eager setzen, wird diese verzögertes Laden von Objekten verhindern mit nur einem id und nichts anderes.

können Sie mehr Informationen zu eifrig Laden finden und es ist hier Anmerkung:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#by-eager-loading

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html.

Was meinen Code, das ist, wie es aussieht, wenn jetzt einen Link zu einem User definieren:

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="answers", fetch="EAGER") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
private $user; 

In diesem Fall wird die User Entität mehr answers haben kann. Wenn ein User aus der answer Perspektive lädt, wird diese Arbeit:

foreach($answers as $answer) { 
    $user = $answer->getUser(); 

    if (!$user) { 
     continue; 
    } 
} 
+0

'eager loading' link zur dokumentation funktioniert nicht –

+0

danke, gefixt :) – Oli

1

Sie können vorübergehend deaktivieren Soft löschen, so dass gelöschte Elemente in Ihre Ergebnisse zurückgegeben werden. See the documentation, speziell für Sie interessant ist der Abschnitt, der lautet:

Dies wird die SoftDeleteable Filter deaktivieren, so Entitäten, die "soft-deleted" in den Ergebnissen erscheint waren $ Ausführungs> getFilters() -> disable ('weich löschbar');

So läuft zuerst den Code oben auf Ihrem Entity-Manager $em und dann verwenden, um Ihre $note zu sammeln.

+0

Das Problem ist, dass ich don Ich möchte nicht, dass übergeordnete Entitäten (z. B. Notizen) gelöscht werden. Wenn Sie den Filter deaktivieren, werden auch gelöschte Notizen zurückgegeben, die ich nicht möchte. –

14

Sie können dies tun, indem sie:

$filter = $em->getFilters()->enable('soft-deleteable'); 
$filter->disableForEntity('Entity\User'); 
$filter->enableForEntity('Entity\Note'); 
+3

Es kann ** 'softdeleteable' ** anstelle von 'soft-deleteable' sein ... (ich benutze stof doctrine extensions) – eDoV

Verwandte Themen