2013-04-04 11 views
5

Tôi đang cố gắng tìm 'Sản phẩm' theo ID và để trái tham gia tất cả 'Ảnh' trên hai điều kiện: ngôn ngữ và trạng thái hoạt động.Doctrine2 LEFT JOIN với 2 điều kiện

Dưới đây là QueryBuilder tôi:

$queryBuilder = $this->createQueryBuilder('p') 
      ->select('p, photos, photoTranslation') 
      ->leftJoin('p.photos', 'photos') 
      ->leftJoin('photos.translations', 'photoTranslation') 
      ->where('p.id = :id') 
      ->andWhere('(photoTranslation.locale = :locale OR photoTranslation.locale IS NULL)') 
      ->andWhere('(photoTranslation.active = :active OR photoTranslation.active IS NULL)') 
      ->setParameters(array(
       'id' => $id 
       'locale' => $this->getLocale(), 
       'active' => true 
      )); 

Nó hoạt động tốt khi không có hình ảnh hoặc khi có ảnh ACTIVE, nhưng không phải khi có một hình ảnh không hoạt động bởi vì nó không phù hợp với một trong những hai điều kiện.

Nếu tôi sử dụng chỉ với một điều kiện, ví dụ chỉ là phần locale, nó hoạt động tốt:

$queryBuilder = $this->createQueryBuilder('p') 
      ->select('p, photos, photoTranslation') 
      ->leftJoin('p.photos', 'photos') 
      ->leftJoin('photos.translations', 'photoTranslation') 
      ->where('p.id = :id') 
      ->andWhere('(photoTranslation.locale = :locale OR photoTranslation.locale IS NULL)') 
      ->setParameters(array(
       'id' => $id 
       'locale' => $this->getLocale() 
      )); 

Còn bây giờ, tôi vòng về đề tài kết quả và unset tất cả các hình ảnh hoạt động ... nhưng Tôi muốn có một cách làm sạch trong QueryBuilder.

Tôi cũng đã cố gắng để đưa các điều kiện về LEFT JOIN khoản:

->leftJoin('photo.translations', 'phototTranslation', Doctrine\ORM\Query\Expr\JOIN::WITH, 'photoTranslation.locale = :locale AND photoTranslation.active = :active') 

Nhưng nó luôn luôn trả về hình ảnh, ngay cả khi nó không hoạt động.

Trả lời

0

Tôi tin rằng một trong những andWhere của bạn nên là một orWhere

+0

Thật không may, cả hai điều kiện "hoạt động" và "miền địa phương" đều được yêu cầu trong trường hợp này. – Tiois

+1

@Tiois Bạn có thể thêm một mẫu nhỏ của mỗi bảng và các kết quả mà bạn đang mong đợi không? Nó có thể giúp bản thân và những người khác thấy được vấn đề tiềm năng tốt hơn. – Shawn

+0

hoặcWhere có thể nhận được kết quả WTF, nó rất khuyến khích để không sử dụng nó. – Hornth

11

Đối với vấn đề này là một giải pháp có thể là:

$em = $this->getEntityManager(); 
$qb = $em->createQueryBuilder(); 
$qb 
    ->select('p', 'pp') 
    ->from('Product', 'p') 
    ->leftJoin('p.photos', 'pp') 
    ->leftJoin('pp.translations', 'ppt', Doctrine\ORM\Query\Expr\Join::WITH, $qb->expr()->andX(
     $qb->expr()->eq('ppt.locale', ':locale'), 
     $qb->expr()->eq('ppt.active', ':active') 
    )) 
    ->where('p.id', ':productId') 
    ->setParameters(
     array(
      'productId', $productId, 
      'active', $active, 
      'locale', $locale 
     ) 
    ); 

    $query = $qb->getQuery(); 
    return $query->getResult(); // or ->getSingleResult(); 

LƯU Ý: ví dụ này là cách để làm điều đó trong Symfony2 (2.3) kho thực thể

+0

Tôi đã xem ở khắp mọi nơi để biết ví dụ về cách thêm điều kiện và IN bên trong truy vấn tham gia. Đó là 'andX' đã cứu ngày của tôi! –