2016-01-06 2 views
1

У меня есть модель базы данных с двумя таблицами: пользователь и экспериментирование. Отношение n: n, поэтому я создал третью таблицу с двумя внешними ключами.Symfony: запрос соединения с использованием QueryBuilder

| Эксперимент | 1 ------- 0..n | ExperimentationUser | 0..n ------- 1 | Пользователь |

Сущность создается благодаря Доктрине (с аннотациями). Я получил UserEntity и ExperimentationEntity, но не ExperimentationUserEntity. Когда я смотрю в USEREntity, я могу найти коллекцию «связанных идентификаторов экспериментов».

Я хотел бы получить все имена экспериментов (не идентификаторы) для указанного пользователя. В общем SQL я присоединяюсь к Experimentation и ExperimentationUser с предложением WHERE (для выбора идентификатора пользователя). Но так как я начинаю проект Symfony (2.8), я бы хотел использовать QueryBuilder.

Я не знаком с синтаксисом, и я понятия не имею, как я могу это достичь. То, что я пробовал:

$repository = $this->getDoctrine()->getRepository('AppBundle:Experimentation'); 
    $query = $repository->createQueryBuilder('e') 
        ->join('...') 
        ->setParameter('id',$id) 
        ->getQuery(); 

Но я не знаю, что поставить в п join. Я даже не уверен, что мне это нужно.

Благодарим за помощь!

+1

Не могли бы вы показать свои сущности, аннотированные доктриной? спасибо – DonCallisto

ответ

1

Так я делаю такие вещи. Я не использую построитель запросов, но вы получаете идею.

В сущности

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
/** 
* Experimentation 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="AppBundle\Entity\ExperimentationRepository") 
*/ 
class Experimentation 
{ 
//... 
} 

В хранилище класса

namespace AppBundle\Entity; 

use Doctrine\ORM\EntityRepository; 

class ExperimentationRepository extends EntityRepository 
{ 
    public function getExperimentationByUser($id) { 

    $em = $this->getEntityManager(); 

    $query = $em->createQuery('SELECT e ' 
     . 'FROM AppBundle:Experimentation e ' 
     . 'JOIN e.experimentationUsers eu ' 
     . 'JOIN eu.user u ' 
     . 'WHERE u.id = :id ') 
     ->setParameter('id', $id); 

    return $query->getResult(); 
    } 
} 

Затем контроллер

//.. 
$em = $this->getDoctrine()->getManager(); 

$entity = $em->getRepository('AppBundle:Experimentation')->getExperimentationByUser($user_id); 
//.. 

В этом случае вы можете получить список экспериментов а, то получить его имя , или также в запросе положить только $query = $em->createQuery('SELECT e.name '. Если вам также нужны данные, связанные с пользователем, можно поставить $query = $em->createQuery('SELECT e, u ' и, возможно, вы можете сохранить запрос на базу данных.

Я надеюсь, что это поможет вам.

+0

Мне удалось сделать что-то подобное, но с помощью Query builder. Я буду принимать ваш ответ в любом случае, поскольку он кажется довольно близким к тому, что у меня есть. – DavidL

+0

Привет @DavidL, можете ли вы опубликовать скрипт querybuilder, который вы написали? Я думаю, что это может помочь некоторым людям (включая меня) – Ducky

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