2013-11-15 2 views
1

모든 경우에 잘 작동하는 간단한 쿼리를 사용합니다. 이것은 사용자가 (예를 들어)되지 않은 사진이있는 경우 쿼리가 잘가는 것을 의미한다 :DQL을 사용하여 교리 쿼리 최적화

$user=$em->getRepository('UserBundle:User')->findOneById($id_user); 

엔티티 사용자는이 피하기 위해 쿼리 수를 최적화 할 수있는 이유는 다른 기업과의 관계를 많이 가지고 교리의 게으른 적재. 그럼 난 DQL가 QueryBuilder 사용하여이 쿼리를 만들 : 사용자가 모든 관련 기관에 대한 정보가있는 경우

public function findUsuario($id_user){ 
    $em = $this->getEntityManager(); 
    $qb = $em->createQueryBuilder(); 
    $qb->select('u, p, co, ci, f, s, q, b, r, se, com, t, beb, prof, v, h, i, idi, usf') 
     ->from('UserBundle:User', 'u') 
     ->innerJoin("u.pais", 'p') 
     ->innerJoin("u.comunidad", 'co') 
     ->innerJoin("u.ciudad", 'ci') 
     ->innerJoin("u.fotos", 'f') 
     ->innerJoin("u.sexo", 's') 
     ->innerJoin("u.quiero", 'q') 
     ->innerJoin("u.busco", 'b') 
     ->innerJoin("u.relacionPareja", 'r') 
     ->innerJoin("u.sexualidad", 'se') 
     ->innerJoin("u.complexion", 'com') 
     ->innerJoin("u.tabaco", 't') 
     ->innerJoin("u.bebida", 'beb') 
     ->innerJoin("u.profesion", 'prof') 
     ->innerJoin("u.vivienda", 'v') 
     ->innerJoin("u.hijo", 'h') 
     ->innerJoin("u.ingreso", 'i') 
     ->innerJoin("u.idiomas", 'idi') 
     ->innerJoin("u.usuarioFavoritos", 'usf') 
     ->where('u.id = :id') 
     ->setParameter('id', $id_user); 

    $query= $qb->getQuery(); 
    return $query->getSingleResult(); 
} 

이 잘 작동을하지만, 예를 들어 사용자가 어떤 사진이없는 경우, 다음과 같은 예외가 발생합니다 : "어떤 결과가 발견되지 않았다 적어도 하나의 행이 예상되었지만 쿼리에 대해 "

나는 왜 누군가가 약간의 빛을 비추 수 있습니까? 감사

답변

2

관계의 다른쪽에 데이터가없는 모든 행을 원하는 경우 내부 조인을 사용해야합니다. 관계의 다른쪽에 데이터가 없으면 행이 생략됩니다.

다양한 종류의 JOIN에 대한 자세한 내용은 on this page을 참조하십시오.

innerJoin 메서드 대신 leftJoin 메서드를 사용해야합니다.

은 (또한, 당신은 더 큰 문제가있다 : 당신은 너무 많은 조인이, 당신의 엔티티의 구성을 검토하고 조언을 것입니다.) 문제가 있었다

+0

, 지금은 잘 작동합니다. 감사! 많은 JOINS에 관해서는 각 사용자마다 많은 속성이 있지만 이는 응용 프로그램 유형에 고유합니다. –