2017-11-09 10 views
0

쿼리 작성기를 사용하여 다른 엔터티와 다른 관계가있는 문서 목록을 설정하고 있습니다. 목록에는 해당 쿼리 작성기의 모든 엔터티에 대한 필터 양식도 포함됩니다. 지금까지는 모두 잘 돌아 갔지만 $ products 엔티티를 추가하자마자 더 이상 작동하지 않습니다. 내 코드 : 그래서 유형과 상태를 들면, 나는 시장, 항공사와 (괴수) 제품에 대한 ManyToOne 관계를 가지고 심포니 오류 : PathExpression이 잘못되었습니다. CollectionValuedAssociationField 여야합니다.

$qb = $em->createQueryBuilder(); 
      $query = $qb->select('d', 'p') 
      ->from('DocumentBundle:Document', 'd') 
      ->innerJoin('d.products', 'p') 
      ->orderBy('d.id', 'DESC') 
      ->join('d.type', 'dt') 
      ->join('d.status', 's'); 


     if(count($type) > 0){ 
      $query->andwhere($query->expr()->in('d.type', ':type')) 
      ->setParameter('type',$type); 
      } 
      if(count($status) > 0) { 
       $query->andWhere($query->expr()->in('d.status', ':status')) 
       ->setParameter('status', $status); 
      } 

      if(count($markets) > 0){ 
      $query->andWhere(':marketIds MEMBER OF d.markets') 
       ->setParameter('marketIds',$markets); 
      } 
      else{ 
      $query->andWhere(':marketIds MEMBER OF d.markets') 
       ->setParameter('marketIds',$userMarkets); 
      } 

      if(count($airlines) > 0){ 
      $query->andWhere(':airlineIds MEMBER OF d.airlines') 
       ->setParameter('airlineIds',$airlines); 
      }else{ 
      $query->andWhere(':airlineIds MEMBER OF d.airlines') 
       ->setParameter('airlineIds',$userAirlines); 
      } 

      if(count($products) > 0){ 
      $query->andWhere(':productIds MEMBER OF p.id') 
       ->setParameter('productIds',$products); 
      } 
      // else{ 
      // $query->andWhere(':productIds MEMBER OF p.id') 
      //  ->setParameter('productIds',$currentuser->getProducts()); 
      // } 

      $query->andWhere('d.active = ?1') 
       ->setParameter(1, $archive ? 0 : 1); 
      return $query 
      ->setFirstResult($page * $maxRows - $maxRows) 
      ->setMaxResults($maxRows) 
      ; 

, 그것은 ManyToMany 관계입니다.

현재 코드 예외가 발생합니다 :이 약

[Semantical Error] line 0, col 237 near 'id AND d.active': Error: Invalid PathExpression. Must be a CollectionValuedAssociationField.

이상한 일을, 나는 또한 제품에 ManyToMany 관계가 다른 기업에 대한 다른 목록을 가지고, 그 목록이 작동하고 있다는 점이다. . 이것에 대해 또 이상한 : 다른 목록을 내 쿼리는 다음과 같습니다

$qb = $em->createQueryBuilder(); 
    $query = $qb->select('a', 'p') 
    ->from('AppBundle:Agency', 'a') 
    ->innerJoin('a.products', 'p') 
    ->orderBy('a.id', 'ASC'); 

    if(count($markets) > 0){ 
     $query->andWhere('a.market IN (:marketIds)') 
     ->setParameter('marketIds',$markets); 
     } 
     else{ 
     $query->andWhere('a.market IN (:marketIds)') 
     ->setParameter('marketIds',$currentUser->getMarkets()); 
     } 

     if(count($products) > 0){ 
     $query->andWhere('p.id IN (:productIds)') 
      ->setParameter('productIds',$products); 
     } 
     else{ 
     $query->andWhere('p.id IN (:productIds)') 
      ->setParameter('productIds',$currentUser->getProducts()); 
     } 

그것은 시장에 대한 ManyToOne 여기에 제품에 대한 ManyToMany입니다 ..

내 문서에 대해 동일한 코드 (p.id in : (productIds) ...)를 시도했는데이 코드는 작동하기 때문에 적어도 더 이상 오류가 발생하지 않습니다. 하지만 시장 (항공사, 제품 등)에 대해 필터를 적용하면 더 이상 작동하지 않으므로 목록이 비어 있습니다. 두 번째 목록 필터링은 작동하고 있습니다. 그래서 나는 이것이 어디서 오는 것인지 정말로 모른다. 사전에 도움을 주셔서 감사합니다!

코드 업데이트

$qb = $em->createQueryBuilder(); 
      $query = $qb->select('d', 'p', 'm', 'a') 
      ->from('DocumentBundle:Document', 'd') 
      ->innerJoin('d.products', 'p') 
      ->innerJoin('d.markets', 'm') 
      ->innerJoin('d.airlines', 'a') 
      ->orderBy('d.id', 'DESC') 
      ->join('d.type', 'dt') 
      ->join('d.status', 's'); 
    if(count($type) > 0){ 
      $query->andwhere($query->expr()->in('d.type', ':type')) 
      ->setParameter('type',$type); 
      } 
      if(count($status) > 0) { 
       $query->andWhere($query->expr()->in('d.status', ':status')) 
       ->setParameter('status', $status); 
      } 
if(count($markets) > 0){ 
      $query->andWhere('m.id IN (:marketIds)') 
       ->setParameter('marketIds',$markets); 
      } 
      if(count($airlines) > 0){ 
      $query->andWhere('a.id IN (:airlineIds)') 
       ->setParameter('airlineIds',$airlines); 
      } 
      if(count($products) > 0){ 
       $query->andWhere('p.id IN (:productIds)') 
       ->setParameter('productIds',$products); 
       } 
$query->andWhere('d.active = :archiveParam') 
       ->setParameter("archiveParam", $archive ? 0 : 1); 
       dump($query->getQuery()); 

필터링 어떤 아이디어 .. 상태, 유형 및 시장 아니지만 항공사와 제품에 대한 작동합니까?

재현 문제가

Filter Form

그래서 이것은 내 filterform입니다 (불필요한 필터는 검은 색이다). 그들은 모두 다중 선택 드롭 다운입니다. 시장 및 상태를 필터링 할 때 목록은 특정 상태가 있거나 선택한 시장에 할당 된 문서로만 축소됩니다. ManyToMany 관계 (시장, 항공사 및 제품) 모두에 대해 나는 자신의 데이터베이스 테이블을 가지고 있으며 모두 데이터를 포함하고 있습니다. 흠 나는 그것을 알아 내기 위해 도움이 될만한 것이 무엇인지 모르겠다. 알려줘 !!

샘플 데이터는 다음과 같습니다. 문서 번호. 42는 항공사 LH 및 LX에, CA, MX 및 US 시장에, 그리고 Nr. 1. 시장 중 하나를 필터링하면 문서가 항상 목록에 나타납니다. 그러나 항공사 나 제품 중 하나를 필터링 할 때 목록이 비어 있습니다.

및 추가 편집 : 방금 전에 제품 필터를 추가했는데 그 전에 항공사 필터링이 실제로 작동했습니다. d.airlines의 멤버와 함께 '잘못된'쿼리를 사용했지만

답변

0

if(count($products) > 0){ 
    $query->andWhere(':productIds MEMBER OF p.id') 
     ->setParameter('productIds',$products); 
} 

당신은 또한 위치 및 명명 된 매개 변수를 믹싱이

if(count($products) > 0){ 
    $query->andWhere('p.id IN (:productIds) ') 
     ->setParameter('productIds',$products); 
} 

같이한다이 부분.

$query->andWhere('d.active = :archiveParam') 
    ->setParameter("archiveParam", $archive ? 0 : 1); 
+0

참고 : 나는 이미 그런 식으로하지만 필터링이 더 이상 작동하지 않는 시도했다 .. 어쨌든 – sonja

+0

참고 .. 내 코드를 업데이트하지만 여전히 작동하지 않습니다 : 내 대답은 확실히에서이 오류를 해결하여 질문. 다른 오류/질문이있는 경우 - 더 구체적으로 설명하십시오 (또는 다음 번에 내 의견을 읽으십시오). – svgrafov

+0

왜 그렇게 심한가? – sonja