2012-03-29 2 views
6

Я пытаюсь выяснить, как сделать запрос «многие ко многим» в Doctrine 2, и я не могу найти ответ. Я точно знаю, как это сделать в SQL:Запрос Many-to-many в Doctrine 2

 SELECT ma.id, 
      ma.name 
     FROM user u 
     JOIN user_media_area uma ON uma.user_id = u.id 
     JOIN media_area ma ON uma.media_area_id = ma.id 

Как бы я сделал то же самое с Доктриной?

+2

Почему этот вопрос ниспровергнут? –

ответ

5

В руководстве есть некоторые хорошие примеры: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/query-builder.html

В вашем случае это будет выглядеть примерно так:

// Build query 
    $em = $this->getEntityManager(); 
    $qb = $em->createQueryBuilder(); 

    $qb->addSelect('user'); 
    $qb->addSelect('mediaArea'); 

    $qb->from('SomeBundle:User','user'); 

    $qb->leftJoin('user.userMediaArea','userMediaArea'); 
    $qb->leftJoin('userMediaArea.mediaArea','mediaArea'); 

    $query = $qb->getQuery(); 
    $users = $query->getResult(); 
    echo $users[0]->getUserMediaArea()->getName(); 

Вы не размещать код лица, так что я должен был сделать некоторые гадать о том, как вы определили отношений. Если у вас просто есть простой ManyToMany между User и MediaArea, вы можете пропустить соединение UserMediaArea. D2 выяснит это. И поскольку вам действительно нужна информация MediaArea, я бы фактически отменил запрос и сделаю выбор из MediaArea, поэтому информация о пользователе не потребуется возвращать. Но я пытался выполнить ваш первоначальный запрос.

+0

Спасибо! Это сработало. (Я немного изменил исходный код, но во время этого комментария редактирование еще не было рассмотрено экспертами.) Спасибо, особенно за то, что я действительно понял свой вопрос и используя имена своих сущностей в вашем ответе. –

+0

@ У вас есть идея, как это сделать в native sql с отображением набора результатов. – hardik

+0

К сожалению нет. В тех немногих случаях, когда мне приходилось использовать sql (по соображениям производительности), я сам делаю сопоставления. – Cerad

-1
SELECT ma.id, ma.name 
FROM User u 
JOIN u.media 

Пользователь является субъектом пользователя, а u.media является объектом СМИ.

+1

Спасибо за ответ. Как насчет части PHP? Как это будет? –

+0

$ sql = 'SELECT ma.id, ma.name FROM User u JOIN u.media'; \t $ result = $ entityManager-> createQuery ($ sql) -> getResult(); –

+0

Я не пробовал это. При ближайшем рассмотрении ваш DQL даже не ссылается на мою таблицу соединений. Откуда могла бы быть ваша «мама»? Кроме того, у меня нет ничего, что называется 'media'. Я не уверен, что вы читаете мой вопрос или тщательно проверяете свой ответ. –

Смежные вопросы