Digamos que tengo dos entidades en mi proyecto Symfony2: Category
y Article
(una categoría que tiene muchos artículos).Doctrine2 (Doctrine 2.1) carga ansiosa en Symfony2
En mi CategoryRepository
, tengo este método:
findAllDummy(){
return $this->createQueryBuilder('c')
->leftJoin('c.Articles a')
->getQuery()->getResult();
}
si no recuerdo mal, en Symfony1.4 (y la versión correspondiente de Doctrina), los objetos devueltos tendrían su atributo 'artículos' llenado por los objetos correspondientes Article
. Ahora, en Symfony2, se devuelven los objetos Proxy.
Así que si recorro los artículos de una categoría específica, se ejecutarán tantas consultas como iteraciones.
foreach($category->getArticles() as $article){
echo $article->getDoctrine()
->getRepository('')getTitle();
}
Entiendo que este es el comportamiento de carga diferida predeterminado de Doctrine2.1.
Pregunta 1: ¿cómo es esta una solución mejor? N dudas en lugar de 1.
Me trataron de obligar a la carga con ganas de la siguiente manera:
findAllDummy(){
return $this->createQueryBuilder('c')
->leftJoin('c.articles a')
->getQuery()
->setFetchMode('Category', 'articles', 'EAGER')
->getResult();
}
Pero el resultado sigue siendo el mismo.
Pregunta 2: cómo forzar la carga ansiosa en Doctrine2?
@Crozin Todavía estoy un poco confundido ... cuando dices "define lo que se debe cargar", ¿te refieres a lo que está hidratado? –
@SamSelikoff Sí, si define la relación 'fetch = EAGER' en artículos, todos los artículos se cargarán (e hidratarán) cuando llame a' categoryRepository-> findOne (321) ' – Crozin
¿Cuál es la diferencia entre cargar e hidratar? –