Symfony: запрос на присоединение с использованием QueryBuilder

1

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

| Эксперимент | 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
    Не могли бы вы показать свои сущности, аннотированные учением? Спасибо
Теги:
doctrine2

1 ответ

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);
//..

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

Надеюсь, это поможет вам.

  • 0
    Мне удается сделать что-то подобное, но с помощью построителя запросов. Я все равно приму ваш ответ, так как он кажется довольно близким к тому, что я получил сейчас
  • 0
    Привет @DavidL, ты можешь опубликовать сценарий построителя запросов, который ты написал? Я думаю, что это может помочь некоторым людям (включая меня)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню