tutorial symfony2 español consultas symfony doctrine2

español - consultas doctrine symfony2



Obtener solo ID de las relaciones de entidad sin obtener un objeto completo en Doctrine (4)

Suponer que tengo una entidad, que hace referencia a sí misma para mapear las relaciones padre-hijo

class Food { /** * @ORM/Id * @ORM/Column(type="integer") * @ORM/GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM/ManyToOne(targetEntity="Food", inversedBy="foodChildren") * @ORM/JoinColumn(name="food_group_id", nullable=true) */ protected $foodGroup; /** * @ORM/OneToMany(targetEntity="Food", mappedBy="foodGroup", fetch="LAZY", cascade={"remove"}) */ protected $foodChildren;

Tengo un caso de uso en el que quiero obtener food_group_id de una entidad sin obtener el objeto primario completo de la base de datos. Usar fetch="LAZY" no fetch="LAZY" que Doctrine vuelva a consultar. ¿Hay alguna manera de devolver solo la identificación al obtener $food->getFoodGroup() ?


Debería poder definir el campo ID, asociarlo con el ORM y luego crear el getter para ese campo, y debería funcionar.

/** * @ORM/ManyToOne(targetEntity="Food", inversedBy="foodChildren") * @ORM/JoinColumn(name="foodGroupId", referencedColumnName="id") */ protected $foodGroup; /** * @ORM/Column(type="integer") */ protected $foodGroupId; public function getFoodGroupId() { return $this->foodGroupId; }

Tenga en cuenta que cambié el nombre del campo en mi ejemplo a Pascal Case, por coherencia. Además, soy nuevo en Symfony, pero el mapeo de la asociación ManyToOne parece extraño. No estoy seguro de por qué tiene nullable en la entidad (simplemente no he visto eso antes). No tiene unColumnName referencia = "id", pero tal vez es simplemente porque se predetermina a "id" (me gusta ser explícito). Ver Doctrine docs .

Tuve un problema muy similar , que fue causado simplemente porque no había asociado ese campo con el ORM. Por lo tanto, debe saber que es posible llamar:

$food = $em->getRepository("AcmeFoodBundle:Food")->find($id); $food->getFoodGroupId();


No compliques tu vida, solo puedes hacer

$food->getFoodGroup()->getId()

¡Esto NO REALIZARÁ ninguna consulta adicional ni activará la carga lenta!

¿Por qué? Porque su $food->foodGroup es un objeto proxy que conoce su ID. Solo hará una carga lenta si llama a un método getter de algún campo que no ha sido cargado.


No estoy seguro si esto es un problema de rendimiento y estás tratando de limitar las consultas, pero ¿por qué no hacer algo como esto en tu getter (supongo que es tu entidad de alimentación usando Doctrine ORM Annotations):

class Food { ... public function getFoodGroup() { $foodGroup = $this->getFoodGroup(); return $foodGroup->getId(); }

o mejor aún nombrarlo apropiadamente getFoodGroupId()


Puedes usar

$em->getUnitOfWork()->getEntityIdentifier(...);

para obtener id sin hacer uniones.

En tu ejemplo, sería algo como esto:

$em = $this->getDoctrine()->getManager(); $food = $em->getRepository(''HungryHungryBundle:Food'')->findOneById($id); print_r($em->getUnitOfWork()->getEntityIdentifier($food->getFoodGroup())); die();

De esta forma obtendrás el food_group_id sin hacer una unión extra.