gedmo extensions extension created symfony doctrine soft-delete

extensions - Symfony2/Doctrine: Lectura de datos "eliminados" al usar las extensiones de doctrina de Gedmo



symfony 4 gedmo (3)

Estoy construyendo un proyecto Symfony2 y estoy usando gedmo/doctrine-extensions ( GitHub ) para implementar la eliminación de software. Mi pregunta es si hay una forma de "deshabilitar" o "anular" la opción softdelete, o incluso detectar si se borró algo.

Aquí está la situación:

Tengo una entidad de "nota" que hace referencia a una entidad de "usuario". Una nota específica hace referencia a un usuario que se ha eliminado por software. Aunque el usuario ha sido eliminado, regresa verdadero para la lógica "está definida" de TWIG e incluso puede devolver la identificación del usuario eliminado. Sin embargo, si consulto otra información (incluido el parámetro "deletedAt" que marca si se eliminó o no) obtengo un error de 500 "Entity was not found".

Dado que los datos todavía están allí, y dado que la nota en sí no se ha eliminado, me gustaría decir quién escribió la nota, aunque el usuario haya sido eliminado.

¿Es eso posible? Si no, ¿cómo puedo detectar correctamente si algo se ha eliminado por software? Como dije, $note->getUser() aún recupera un objeto y devuelve verdadero para cualquier comparación nula / "está definida".


Debe establecer la carga de la relación en eager , esto evitará la carga lenta de objetos con solo una id y nada más.

Puede encontrar más información sobre la carga ansiosa y su anotación aquí:

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 .

En cuanto a mi código, así es como se ve al definir un enlace a un User ahora:

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

En este caso, la entidad de User puede tener múltiples answers . Al cargar un User desde la perspectiva de la answer , esto funcionará:

foreach($answers as $answer) { $user = $answer->getUser(); if (!$user) { continue; } }


Puede desactivar temporalmente el borrado suave para que los elementos eliminados se devuelvan en sus resultados. Vea la documentación , específicamente interesante para usted es la sección que dice:

Esto deshabilitará el filtro SoftDeleteable, por lo que las entidades que fueron "borradas por software" aparecerán en los resultados $ em-> getFilters () -> disable (''soft-deletedable'');

Entonces, primero ejecute el código de arriba en su Entity Manager $em y luego úselo para cobrar su $note .


Puedes hacer esto por:

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