Doctrine entity remove vs delete query, performance comparison

Al usar doctrine, noté que, para eliminar una entidad, necesito recuperar esa entidad por el parámetro dado (nombre, id, etc.) y luego llamar al método remove. Por otro lado, en la consulta, puedo ejecutar la consulta de eliminación.

Entonces, parece que usar el estilo ORM requiere dos operaciones y la operación sql general requiere una operación. Por eso, estoy un poco confundido, si deberíamos usar la operación de eliminación (o actualización) en ORM? ¿No es peor en rendimiento? O hay algo más que me estoy perdiendo? ¿Se puede hacer de otra manera en el estilo ORM?

En Doctrine2 puede llamar a la eliminación en un objeto proxy, que no se carga desde la base de datos. Solo crea un objeto “ficticio”, algo así como:

$user = $em->getPartialReference('model\User', array('id' => $id)); $em->remove($user); 

No requiere la consulta inicial, pero no estoy seguro de si Doctrine todavía lo hace internamente en Fush . No lo veo en el SqlLog.

Solo para agregar, creo que este es el comportamiento esperado de cualquier ORM decente. Se trata de objetos y relaciones. Tiene que saber que algo existe antes de eliminarlo. ORM no es solo un generador de consultas . En general, una consulta nativa siempre será más rápida en cualquier ORM. Cualquier ORM agrega una capa de abstracción y lleva tiempo ejecutarla. Es una compensación típica, usted obtiene algunas características sofisticadas y un código limpio, pero pierde algo de rendimiento.

EDITAR:

Me alegra que haya funcionado para ti. En realidad, me encontré con otro problema, que me hizo darme cuenta de que los proxies y los objetos parciales no son en realidad lo mismo. Los objetos parciales instancian la clase de modelo real y lo llenan con los valores que desea. Después de inicializar un objeto parcial, la carga diferida ya no funciona. Entonces, por ejemplo, si crea un objeto parcial con solo el id, y desea eliminar solo si otro campo de objeto satisface alguna condición, no funcionará, porque ese otro campo siempre será nulo.

Por otro lado, los proxies funcionan con carga lenta y no comparten los problemas que tienen los objetos parciales. Por lo tanto, le sugiero que no use el método getPartialReference , sino que puede hacer algo como:

 $user = $em->getReference('model\User', $id); $em->remove($user); 

El método getReference devuelve el objeto si ya está cargado o un proxy si no lo está. Un proxy puede cargar de forma diferida todos los demás valores si / cuando los necesita. En cuanto a su ejemplo, se comportarán exactamente igual, pero los apoderados seguramente son una mejor forma de hacerlo.

¡Hecho! para mí funcionaba así: agrega la línea 3:

 $user = $em->getReference('model\User', $id); $em->remove($user); $em->flush();