2016-07-13 11 views
2

Моя сущность User связана с другими объектами через отношения OneToOne, и я каскадирую «удаление» для всех из них.Symfony: как восстановить каскад при использовании расширения SoftDeleteable?

Я использую SoftDeleteable расширения поведения, поэтому, когда я удалить User, объект не убирается из базы данных: deletedAt поля просто установлено в DateTime (сейчас), и поэтому все deletedAt поля связанных с ним.

Теперь, когда я хочу, чтобы восстановить пользователя, я, как это предлагается в документации:

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

Моя проблема все связанные объекты оставаться удалены, когда я делаю это. Любая идея, как я могу автоматически каскадировать setDeleted (null) для всех из них?

+0

Просто для того, чтобы быть уверенным: вы выполняете сброс после установки deletedAt в null? – dlondero

ответ

2

Никогда не использовал это расширение, но, глядя на открытые вопросы, на GH хранилище можно увидеть довольно много из них связаны с аналогичными проблемами при работе с ассоциациями:

Я бы попытался сначала отключить явно фильтр для каждого связанного объекта:

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

В противном случае я бы добавил слушателя (и привязал его к одному из событий Doctrine) для каскадирования восстановления за пределами soft-deleteable.

+0

Спасибо за ваш ответ. Я попытаюсь добавить слушателя, как вы предложили, даже если это выглядит не очень легко. – Roubi

+0

Проще, чем вы думаете! См. Документы http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html – dlondero

+0

Да, привязка события легко, что я не смог выяснить, как получить все «каскадные» сущности. Что-то вроде $ object-> getCascadedRelations(). Информация, безусловно, может быть найдена в сопоставлении, но я не знаю, как ее извлечь. – Roubi