2017-09-25 13 views
0

하나의 요청에 포함시키려는 모든 항목을 얻으려고 querybuilder을 만들었지 만 결국에는 26 개의 sql 요청을 만듭니다.symfony querybuilder 및 SQL 요청 번호 증가

할 방법이 있습니까?

답변/도움에 감사드립니다.

$builder = $this->createQueryBuilder("message") 
    ->innerJoin("AppBundle:User", "user", "WITH", "message.sender = user.id") 
    ->innerJoin("AppBundle:Thread", "thread", "WITH", "message.thread = thread.id") 
    ->innerJoin("AppBundle:MessageMetadata", "messageMetadata", "WITH", "messageMetadata.message = message.id AND messageMetadata.participant != user.id") 
; 

$builder = $this->filterSoftdelete($builder, $user); 

if($filters != null) { 
    foreach ($filters as $key => $value) { 
     $builder->andWhere("(message.recipient = :id AND user.firstname LIKE '%". $value ."%') OR 
       (message.recipient = :id AND user.lastname LIKE '%". $value ."%') OR 
       (message.recipient = :id AND thread.subject LIKE '%". $value ."%')") 
      ->setParameter("id", $user->getId());; 
    } 
} else { 
    $builder->andWhere("message.recipient = :id or message.sender = :id") 
     ->setParameter("id", $user->getId()); 
} 

if($ordering != null) { 
    foreach ($ordering as $key => $value) { 
     if($key == "subject") { 
      $builder->addOrderBy("thread.subject", $value); 
     } else if($key == "createdAt") { 
      $builder->addOrderBy("message." . $key, $value); 
     } else { 
      $builder->addOrderBy("messageMetadata.isRead", "desc"); 
     } 
    } 
} else { 
    $builder->addOrderBy("messageMetadata.isRead", "desc"); 
} 

return $this->query($builder); 

답변

0

빌더해야 만 불 하나 개의 요청 : 여기

쿼리 빌더입니다. 하지만 어쩌면 당신이 가져 오지 않은 속성이나 조인 된 콜렉션에 접근하려하고 게으른 로딩이 일어나서 많은 원치 않는 요청을 만들어 낼 수 있습니다.

일반적으로 컨트롤러에 당신은 당신의 빌더를 사용하여 개체를 가져올 때 (아마도 나뭇 가지에) 당신의 기관을 통해 당신에게 그런 다음 루프를

$entities = $em->getRepository('myrepo')->myCustomQuery($myparams...); 

을 :

foreach ($entities as $entity) { 
    $entity->getAssociation()->doSomething; // sometime here you forgot to fetch sayed association 
} 

솔루션은에 ->addSelect()을 사용하는 것입니다 쿼리 빌더는 관련 엔티티의 선택 및 수화를 강제 실행합니다.

기본적으로 당신이하고있는

:

SELECT entity.* FROM entity JOIN other_entity ON ...; 

그리고 교리 필요 원치 않는 쿼리의 결과 누락 된 other_entity를 가져옵니다.

그러나 당신은 일을해야한다 :

SELECT entity.*, other_entity.* FROM entity JOIN other_entity ON ...; 

당신은 귀하의 요청을보고 심포니 도구 모음을 사용합니다.

희망이 도움이

내가가, 내가 좋아하는, 또 다른 문제가 생겼어요 않는
+0

, 엔티티 클래스 대기하고 $ 빌더 = $ this-> createQueryBuilder ("메시지"에 OtherEntity 클래스 –

+0

을 gived) innerZoin ("AppBundle : Thread", "thread", "WITH", "BOOK") -> innerJoin ("AppBundle : User", "user", "WITH", "message.sender = user.id")- ("AppBundle : MessageMetadata", "messageMetadata", "WITH", "messageMetadata.message = message.id and messageMetadata.participant! = user.id") ; 당신은 $ builder-> addSelect ('user')를 추가 할 수 있습니다 ... –

+0

고맙습니다, 내가해볼 게.이 경우에는 innerjoin은 괜찮지 만 다른 경우에는 내 프로젝트에서 leftjoin 원인이 필요하다. 외래 키는 null입니다. 쿼리 작성기를 사용하여 요청을 한 번에 가져올 방법이 없습니다. –