Symfony2/Doctrine: Чтение удаленных данных при использовании расширений доктрины Gedmo

Я создаю проект Symfony2 и использую gedmo/doctrine-extensions (GitHub) для реализации обратимого удаления. Мой вопрос заключается в том, есть ли способ «отключить» или «отменить» мягкое удаление или даже определить, было ли что-то удалено.

Вот ситуация:

У меня есть объект «заметка», который ссылается на объект «пользователь». Конкретная заметка ссылается на пользователя, который был обратимо удален. Несмотря на то, что пользователь был удален, он возвращает true для логики TWIG «определено» и может даже возвращать идентификатор удаленного пользователя. Однако, если я запрашиваю любую другую информацию (включая параметр «deletedAt», который отмечает, был ли он удален), я получаю ошибку 500 «Объект не найден».

Поскольку данные на самом деле все еще там, и поскольку сама заметка не была удалена, я все же хотел бы сказать, кто написал заметку, даже если пользователь был удален.

Это возможно? Если нет, то как мне правильно определить, было ли что-то удалено? Как я уже сказал, $note->getUser() по-прежнему извлекает объект и возвращает true для любых сравнений null / "определено".


person Nathan Rutman    schedule 23.10.2013    source источник
comment
Это известное ограничение Doctrine2, см. github.com/doctrine/doctrine2/issues/4543   -  person PowerKiKi    schedule 09.11.2017


Ответы (3)


Вам нужно установить загрузку отношений на eager, это предотвратит ленивую загрузку объектов только с id и ничем другим.

Вы можете найти больше информации о нетерпеливой загрузке и ее аннотацию здесь:

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.

Что касается моего кода, то вот как он теперь выглядит при определении ссылки на User:

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

В этом случае сущность User может иметь несколько answers. При загрузке User с точки зрения answer это будет работать:

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

    if (!$user) {
        continue;
    }
}
person Oli    schedule 26.06.2014

Вы можете сделать это:

$filter = $em->getFilters()->enable('soft-deleteable');
$filter->disableForEntity('Entity\User');
$filter->enableForEntity('Entity\Note');
person trrrrrrm    schedule 04.12.2013
comment
Это может быть 'softdeleteable' вместо 'soft-deleteable'... (я использую расширения доктрины stof) - person eDoV; 25.09.2015

Вы можете временно отключить обратимое удаление, чтобы удаленные элементы возвращались в ваши результаты. см. документацию, особенно для вас интересен раздел, который гласит: :

Это отключит фильтр SoftDeleteable, поэтому объекты, которые были «обратимо удалены», появятся в результатах $em->getFilters()->disable('soft-deleteable');

Итак, сначала запустите приведенный выше код в Entity Manager $em, а затем используйте его для сбора $note.

person Nada_Surf    schedule 23.10.2013
comment
Проблема в том, что я не хочу, чтобы родительские объекты (например, заметки) были удалены. Отключение фильтра также вернет удаленные заметки, которые мне не нужны. - person Nathan Rutman; 24.10.2013