2012-09-14 14 views
6

Estoy usando Doctrine 2 para mapear un horario académico. He aquí un vistazo simplificada en las relaciones:Doctrina: ¿Ansioso por cargar las relaciones de una relación perezosa?

  • Un clase tiene eventos (uno-a-muchos)
    • Un caso tiene un tipo (muchos-a-uno)
    • un evento tiene una ubicación (muchos-a-uno)

Usando $em->find() que puedo pedir a la clase solamente, con las relaciones-cargado ligeramente. O usando DQL con combinaciones, puedo cargar todo el gráfico de objetos. ¿Hay alguna solución intermedia?

Quiero a buscar una clasecon relaciones-perezosos cargado, y luego bajo ciertas condiciones de disparo de una carga ansiosos de la relación evento y todos los eventos propiedades. Por lo tanto, cuando llamo a algo como $class->getEventsHydrateAll(), todos los eventos y tipos de eventos y ubicaciones de eventos se hidratarán a la vez.

Creo que podría lograr esto mediante la actualización de mi caso esquema para marcar el tipo y ubicación relaciones como fetch="EAGER". Pero me gustaría tener control sobre cuándo ocurre esta hidratación profunda.

Aquí hay uno intento que hice en mi repositorio clase, pero Doctrina está ejecutando consultas individuales para buscar cada tipo y ubicación.

$query = $this->_em->createQuery(' 
     SELECT c FROM My\Entity\Class c 
     WHERE c.id = :classId 
'); 
$query->setParameter('classId', $classId) 
     ->setFetchMode('My\Entity\Event', 'type', 'EAGER') 
     ->setFetchMode('My\Entity\Event', 'location', 'EAGER'); 

try { 
    return $query->getSingleResult(); 
} catch (\Doctrine\ORM\NoResultException $e) { 
    return NULL; 
} 

¿Alguien sabe si Doctrine admite esto? ¡Gracias!

+0

No está seguro de si se trata de manejar que ya tiene 3 niveles en lugar de 2. TRY -> setFetchMode ('Mi \ Entidad \ Class', 'tipo' , 'EAGER') –

Respuesta

Cuestiones relacionadas