2013-04-04 14 views
5

Sto provando a trovare un 'Prodotto' per ID, ea sinistra unisco tutte le sue 'Foto' a due condizioni: la locale E lo stato attivo.Doctrine2 SINISTRA SINISTRA con 2 condizioni

Ecco la mia QueryBuilder:

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

Funziona bene quando ci sono foto o quando ci sono le foto attiva, ma non quando c'è un inattiva Photo perché non corrisponde a uno dei due condizioni.

Se io uso una sola condizione, per esempio solo la parte locale, funziona benissimo:

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

Per ora, ciclo sulla tesi risultati e disinserire tutte le foto inattive ... ma Mi piacerebbe un modo pulito di fare in QueryBuilder.

Ho anche provato a mettere le condizioni sul LEFT JOIN clausola:

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

ma restituisce sempre la foto, anche se è inattivo.

risposta

0

Credo che uno dei tuoi andwhere dovrebbe essere un orWhere

+0

Sfortunatamente, in questo caso sono richieste entrambe le condizioni "attive" e "locali". – Tiois

+1

@Tiois Puoi aggiungere un piccolo esempio di ogni tabella e i risultati che ti aspetti? Potrebbe aiutare me stesso e gli altri a vedere meglio il potenziale problema. – Shawn

+0

o Dove è possibile ottenere risultati WTF, si consiglia vivamente di non utilizzarlo. – Hornth

11

Per questo problema una soluzione potrebbe essere:

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

NOTA: questo esempio è il modo di farlo in Symfony2 (2.3) repository entità

+0

Ho cercato dappertutto un esempio su come aggiungere condizioni e IN all'interno di una query di join. Quel 'eX' mi ha salvato la giornata! –

Problemi correlati