2016-12-21 12 views
0

ORM QueryBuilder에 큰 문제가 있습니다. 내가해야 할 일은 다음과 같습니다. order의 개수가 products이고 많은 관련 엔티티 (order과 연결되어 있음)를 가져와야하지만 여기에는 관련이 없다고 가정합니다. 나는 또한 그 수에 의한 결과를 주문할 필요가있다.Doctrine2 QueryBuilder가 엔티티와 엔티티의 수를 선택했습니다.

아무에게 나 달성 할 수있는 방법의 예를 줄 수 있을까요? 가능하다면 "인라인"DQL을 피하고 싶습니다.

+0

약 2 가지 해결책이 있다고 생각합니다. 먼저 주문 테이블에 제품 수를 유지 한 다음 복잡하고 느린 쿼리는 피할 수 있습니다. 두 번째는 DQL을 [DTO] (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#new-operator-syntax)와 함께 사용하는 것입니다. object –

+0

또는 제품을 이미 가져온 경우 PHP로 계산합니다. –

+0

@ skowron-line 이것은 다음 단계에서 제품의 상태로 "개수"를 필터링해야하기 때문에 실용적이지 않으므로 실제로 자주 업데이트 될 것입니다. 난 순서대로 필드를 계산하는 불필요한 업데이 트를 피고 싶습니다. 또한 정상화에 반대합니다. – user1970395

답변

2

Doctrine Query Builder를 통해 데이터를 얻을 수 있습니다.

Order에서 제품을 가입시킨 다음 주문 ID별로 그룹화해야합니다. select 문에 COUNT(product.id)을 입력하고 order by 절의 별칭을 사용하여 주문을 정렬 할 수 있습니다. 다음은 Repository의 작은 코드 스 니펫입니다.

/** 
* @return \Doctrine\ORM\Query 
*/ 
public function getHotelAndRoomType() 
{ 
    $qb = $this->createQueryBuilder('order') 
     ->select('partial order.{id, orderId} as order, count(product.id) as total_products_in_order') 
     ->leftJoin('AppBundle:Product', 'product', 'WITH', 'product.order = order.id') 
     ->groupBy('order.id') 
     ->orderBy('total_products_in_order', 'DESC') 
    ; 

    return $qb->getQuery()->execute(); 
} 

참고 : 코드 테스트를 거치지 않았습니다.

+0

예상대로 작동합니다. 이것이 내가 찾고있는 올바른 해결책입니다. – user1970395