2016-12-20 3 views
0

У меня есть объекты Offer и Area и здесь один Offer может иметь много Areas и один Area принадлежат ко многим Offers:Symfony2 - Учение DQL - многие ко многим запроса

Offer лицо:

/** 
* @ORM\ManyToMany(targetEntity="Area") 
* @ORM\JoinTable(name="relationship_offer_areas", 
*  joinColumns={@ORM\JoinColumn(name="offer_id", referencedColumnName="id", onDelete="CASCADE")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="area_id", referencedColumnName="id")} 
*  ) 
*/ 
private $areas; 

Теперь я Я пытаюсь получить Offers по Area с использованием DQL (не запрос строителя!):

$query = 'SELECT o FROM IndexBundle:Offer o '. 
    'LEFT JOIN IndexBundle:Area a '. 
    'WHERE a = :area '. 
    'ORDER BY o.startDate ASC'; 

Здесь :area is Area объект-объект. К сожалению, он работает не так, как ожидалось. Я получаю все строки предложений со всеми областями.

Любые идеи, что мне не хватает? Работа с объектами в языке запросов действительно крутит мой разум. Спасибо!

ответ

1
$query = 'SELECT o FROM IndexBundle:Offer o '. 
'LEFT JOIN o.areas a '. 
'WHERE a.id = :areaId '. 
'ORDER BY o.startDate ASC'; 

Он не знает, как использовать JOIN на лету. Используйте свойства ваших объектов для присоединения. Это точно так же, как вы делаете LEFT JOIN в SQL, поскольку вы ссылаетесь на столбец, из которого вы хотите получить дополнительные данные. Как указано в ON соединения.

Выравнивание по левому краю с использованием DQL - См документации: Doctrine DQL - Select examples

$query = $em->createQuery('SELECT u.id, a.id as article_id FROM CmsUser u LEFT JOIN u.articles a'); 
$results = $query->getResult(); // array of user ids and every article_id for each user 
Смежные вопросы