2017-01-05 3 views
0

У меня есть три сущности, связанные с различными отношениями:Как получить доступ к атрибуту LEFT JOIN в отношении ManyToMany?

-Band- 
name 
... 
tours (ManyToMany with Tour) 
shows (OneToMany with Show) 

-Tour- 
name 
... 
bands (ManyToMany with Band) 
$shows(OneToMany with Show) 

-Show- 
date 
... 
band(ManyToOne with Band, nullable) 
tour(ManyToOne with Tour, nullable) 

Я могу настроить Показать для диапазона (то есть show_tour NULL), а также Показать на Туре (тогда show_band является NULL).

Теперь, я хотел бы получить все Show для данного Band. Мой DQL как это:

public function findAllShowsToComeFor($band) 
{ 
    $date = new \DateTime('now'); 
    return $this->createQueryBuilder('s') 
     ->leftJoin('s.band', 'band') 
     ->where('band.id = :bid') 
     ->setParameter('bid', $band->getId()) 
     ->leftJoin('s.tour', 'tour') 
     ->where('tour.bands = :tid') 
     ->setParameter('tid', $band->getId()) 
     ->andWhere('s.day >= :date') 
     ->setParameter('date', $date->format('Y-m-d')) 
     ->orderBy('s.day', 'ASC') 
     ->getQuery() 
     ->getResult(); 
} 

Конечно, это вызывает ошибку синтаксиса ([Семантическая Error] линии 0, столбец 92 вблизи 'полосы =: TID': Ошибка:.. Invalid PathExpression StateFieldPathExpression или SingleValuedAssociationField ожидается) , из-за этих линий:

->leftJoin('s.tour', 'tour') 
->where('tour.bands = :tid') 
->setParameter('tid', $band->getId()) 

я должен был бы сделать что-то вроде:

->leftJoin('s.tour', 'tour') 
->where('tour.bands.id IN :tid') 
->setParameter('tid', $band->getId()) 

, но это не возможно ...

Может ли кто-нибудь помочь?

ответ

1

Существует MEMBER OF, я полагаю, вы хотите что-то вроде этого:

$this->createQueryBuilder('s') 
     ->leftJoin('s.tour', 'tour') 
     ->where('s.band = :band OR :band MEMBER OF tour.bands') 
     ->setParameter('band', $band) 
     ->andWhere('s.day >= :date') 
     ->setParameter('date', $date->format('Y-m-d')) 
     ->orderBy('s.day', 'ASC') 
     ->getQuery() 
     ->getResult(); 
+0

Работаю красиво! Благодаря! – VinZ

0

Вам не нужно фильтровать Tour on ID группы, если вы уже сделали это на Band.

Так что это даст вам следующее:

$this->createQueryBuilder('s') 
    ->join('s.band', 'band') 
    ->where('band.id = :bid') 
    ->leftJoin('s.tour', 'tour') 
    ->where('s.day >= :date') 
    ->orderBy('s.day', 'ASC') 
    ->setParameter('date', $date->format('Y-m-d')) 
    ->setParameter('bid', $band->getId()) 
    ->getQuery() 
    ->getResult(); 

При этом вы получите ArrayCollection шоу, и если ваш делать -> getTour на него, вы можете иметь тур (или NULL).

+0

И вы можете получить доступ на атрибут из LeftJoin, речь здесь идет с tours.bands.id: ваш не присоединился Тур и группа. – Bacteries

+0

Этот запрос не дает мне никакого результата ... "SELECT s0_.id AS id_0, s0_.day AS day_1, s0_.country AS country_2, s0_.city AS city_3, s0_.venue AS place_4, s0_.band_id AS band_id_5 , s0_.tour_id AS tour_id_6 FROM 'show' s0_ INNER JOIN band b1_ ON s0_.band_id = b1_.id LEFT JOIN tour t2_ ON s0_.tour_id = t2_.id WHERE b1_.id = 1 AND s0_.day> = '2017- 01-05 'ORDER BY s0_.day ASC; " – VinZ