2012-03-16 18 views
6

EDITAR: Si tiene problemas similares This Topic le interesará¿Cómo evitar que Doctrine cargue perezosamente relaciones uno a uno?

Tengo un usuario y configuraciones de usuario con una relación bidireccional uno a uno. Parece que incluso si no utilizo ningún valor de UserSettings en mi página, doctrine lozy lo carga de todos modos.

¿Este comportamiento es esperado? ¿Por qué Doctrine busca estos datos aunque no los esté usando en mi página? Si no puedo detenerlo, tendría que unirme a UserSettings al usuario cada vez que recupere un objeto de usuario, pero esto es innecesario.

¿Qué puedo hacer para evitar que esto suceda?

código que carga los datos:

->createQuery('SELECT p, u, s FROM TestPostBundle:Post p LEFT JOIN p.user u LEFT JOIN p.sub s WHERE p.id IN (:ids)') 
->setParameter('ids', $ids) 
->getResult(); 

La ramita en bucle I a través de mensajes y mostrar Mensaje de datos y de usuario asociado, pero nunca lo solicite cualquier variable usersettings, no estoy acceder a ellos en absoluto.

+0

Publique el código que carga a los usuarios, por favor. –

+0

@FractalizeR Acabo de agregar el código – DavidW

+1

No es el comportamiento esperado. Supongo que en algún lugar de hecho estás obteniendo una configuración de usuario. Intenta poner una sentencia die() en tu método getUserSetting. Eso debería confirmar o negar mi especulación. – Cerad

Respuesta

1

También me enfrenté al mismo problema. Parece que al consultar desde la doctrina del lado inverso también se consulta el lado propietario. Ver this discussion.

+0

Publicación relacionada Pensé que podría interesarte ver: http://stackoverflow.com/questions/9848747/primary-key-of-owning-side- as-a-join-column – DavidW

+0

Publiqué una solución en la pregunta relacionada: http://stackoverflow.com/a/14885237/138106 –

4

que he visto esta pregunta planteada en algunos lugares y estoy añadiendo mi respuesta aquí:

me encontré con este mismo problema y recordar que el tutorial symblog dio un ejemplo de cómo reducir la carga diferida de forma explícita agregue uniones hacia la izquierda en las tablas que no necesita. Parece extraño incluir tablas en una combinación cuando ni siquiera quiere esa información, pero de esta manera reducirá todas esas consultas adicionales a 1 y se ejecutará más rápido.

Búsqueda de carga diferida - alrededor de 1/5 del camino hacia abajo http://tutorial.symblog.co.uk/docs/customising-the-view-more-with-twig.html

Para solucionar este problema para el usuario/datos de usuario trate de añadir esto al repositorio de usuarios y el uso de cada vez que se necesita para obtener todos los usuarios, incluso si no quieres datos de usuario Se puede mejorar aún más mediante la selección parcial: - ('p parcial {user_id, nombre,}')> seleccione

public function getAll($limit = 500) { 
     $qb = $this->createQueryBuilder('u') 
      ->select('u', 'd') 
      ->leftJoin('p.userdata', 'd') 
     if (false === is_null($limit)) 
      $qb->setMaxResults($limit); 
    return $qb->getQuery()->getResult(); 
    } 

ACTUALIZACIÓN
El tutorial symblog parece estar abajo y estoy dejando el enlace aquí por el momento en caso de que sea temporal. El código relevante está aquí en la respuesta.

+1

el enlace está roto – Mick

Cuestiones relacionadas