2013-04-04 16 views
5

ID ile bir 'Ürün' bulmaya çalışıyorum ve iki koşulda 'Fotoğraf'ı bulmaya çalışıyorum: yerel ayar ve aktif durum. İşte Doctrine2 LEFT JOIN 2 koşullu

benim QueryBuilder var: AKTİF fotoğraf olduğunda hiçbir Resimler veya zaman iyi çalışır

$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 
      )); 

ancak aktif olmayan Foto orada değil ne zaman biriyle eşleşmesi nedeniyle iki koşul. Ben mesela sadece yerel kısmı için, sadece tek bir koşulu kullanırsanız

, iyi çalışıyor: Şimdilik

$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() 
      )); 

, tezler sonuçları ve unset etkin olmayan tüm Foto'daki ben döngü ... ama QueryBuilder'da yapmak için temiz bir yol istiyorum.

Ben de JOIN yan tümcesi SOL bazı koşullar getirmeye çalıştı:

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

Ama her zaman etkin olmayan olsa bile, Foto döndürür.

$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(); 

NOT: Bir çözüm olabilir bu sorun için bir orWhere

cevap

0

bu örnek Symfony2'deki (2.3) varlık depoyu bunu yapmak için bir yoldur

+0

Maalesef, bu durumda hem "etkin" hem de "yerel" koşullar gereklidir. – Tiois

+1

@Tiois Her tablonun küçük bir örneğini ve beklediğiniz sonuçları ekleyebilir misiniz? Kendimi ve başkalarının potansiyel sorunu daha iyi görmesine yardımcı olabilir. – Shawn

+0

veya WTF sonuçlarını nereden alabilir, kullanmamanız önerilir. – Hornth

11

olmalıdır sizin andWhere birini inanıyoruz

+0

Bir ekleme sorgusunun içine koşulların nasıl ekleneceğine ve IN'ye bir örnek için her yere baktım. Bu 'andX' günümü kurtardı! –