2016-07-13 75 views
2

Meine Entität User ist mit anderen Entitäten durch OneToOne Beziehungen verwandt, und ich kaskadiere "lösche" für alle von ihnen.Symfony: Wie kaskadiert man Undelete bei Verwendung der SoftDeleteable-Verhaltenserweiterung?

Ich verwende SoftDeleteable Verhalten Erweiterung, so dass, wenn ich ein User zu entfernen, wird das Unternehmen nicht tatsächlich aus der Datenbank entfernt: das deletedAt Feld ist einfach zu Datetime (jetzt) ​​gesetzt, und so sind die alle deletedAt Felder der verwandten enites.

Nun, wenn ich einen Benutzer wiederherstellen möchten, ich tun, wie in der Dokumentation vorgeschlagen:

$em->getFilters()->disable('soft-deleteable'); 
$user->setDeletedAt(null); 

Mein Problem ist es, alle zugehörigen Entitäten gelöscht bleiben, wenn ich dies tun. Irgendeine Idee, wie ich die setDeleted (null) auf alle von ihnen automatisch kaskadieren könnte?

+0

Nur um sicher zu sein: Spülen Sie nach dem Setzen von deletedAt auf null? – dlondero

Antwort

2

nie verwendet diese Erweiterung aber bei noch offenen Fragen auf GH-Repository suchen kann ich ganz sehen einige von ihnen auf ähnliche Probleme im Zusammenhang, wenn sie mit Verbänden:

Ich würde versuchen, zuerst den Filter für jede verbundene Einheit explizit zu deaktivieren:

$filter = $em->getFilters()->enable('soft-deleteable'); 
$filter->disableForEntity('Entity\Article'); 
$filter->disableForEntity('Entity\SomeOtherEntity'); 

Andernfalls würde ich einen Listener hinzufügen (und ihn an eines der Doctrine-Ereignisse binden), um die Wiederherstellung außerhalb von soft-deleteable zu kaskadieren.

+0

Danke für Ihre Antwort. Ich werde versuchen, einen Hörer hinzuzufügen, wie Sie es vorgeschlagen haben, auch wenn es nicht sehr einfach aussieht. – Roubi

+0

Leichter als Sie denken! Siehe Dokumentation http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html – dlondero

+0

Ja, das Binden eines Ereignisses ist einfach, was ich nicht herausfinden konnte ist, wie man alle "kaskadierten" Entitäten erhält. Etwas wie $ object-> getCascadedRelations(). Die Information kann sicherlich im Mapping gefunden werden, aber ich weiß nicht, wie man es extrahiert. – Roubi