Сложные запросы в Doctrine ORM

hell0w0rd

Продвинутый новичок
Подскажите, DORM не умеет строить сложные запросы с джойнами?
У меня есть две entities связанные oneToMany и обратно manyToOne. Как самостоятельно не прописывая запрос, вытягивая объект тянуть его связи?
Вот так выглядит код сейчас, внутри шаблона обращаюсь к нужной переменной, twig достаточно умен и обращается к get-функции, а та собственно делает второй запрос, хотя явно можно было бы обойтись одним
PHP:
public function showAction($id)
{
    $post = $this->getDoctrine()
        ->getRepository('SiteDeskBundle:Post')
        ->find($id);
    if( !$post ) {
        throw $this->createNotFoundException('Объявление не найдено. id: ' . $id);
    }

    return $this->render('SiteDeskBundle:Post:show.html.twig', array('post' => $post));
}
 

hell0w0rd

Продвинутый новичок

hell0w0rd

Продвинутый новичок
PHP:
    $post = $this->getDoctrine()
                 ->getRepository('SiteDeskBundle:Post')
                 ->createQueryBuilder('p')
                 ->where('p.id=:id')
                 ->leftJoin('p.dogs', 'dogs')
                 ->setParameter('id', $id)
                 ->getQuery()
                 ->getResult();
Вот такая конструкция генерирует такой запрос:
PHP:
SELECT 
  p0_.id AS id0, 
  p0_.addDate AS addDate1, 
  p0_.mastername AS mastername2, 
  p0_.phone AS phone3, 
  p0_.email AS email4, 
  p0_.metro AS metro5, 
  p0_.city AS city6, 
  p0_.address AS address7 
FROM 
  posts p0_ 
LEFT JOIN 
  dogs d1_ ON p0_.id = d1_.post_id 
WHERE 
  p0_.id = ?
А мне нужен LEFT OUTER JOIN, как сделать?
 

hell0w0rd

Продвинутый новичок
Все, разобрался. Не правильно получал результат, надо ->getResult(); - получает массив, нужно было ->getSingleResult();
Подскажите, а сама doctrine такие запросы не умеет создавать, без подобных конструкций?)
 

Вурдалак

Продвинутый новичок
Вот такого кода быть не должно:
PHP:
    $post = $this->getDoctrine()
                 ->getRepository('SiteDeskBundle:Post')
                 ->createQueryBuilder('p')
                 ->where('p.id=:id')
                 ->leftJoin('p.dogs', 'dogs')
                 ->setParameter('id', $id)
                 ->getQuery()
                 ->getResult();
Всё, что после getRepository() стоит инкапсулировать в сам класс репозиторий. Но сам запрос не имеет смысла, вторая таблица тут ни на что не влияет.
 

hell0w0rd

Продвинутый новичок
Вот такого кода быть не должно:
PHP:
    $post = $this->getDoctrine()
                 ->getRepository('SiteDeskBundle:Post')
                 ->createQueryBuilder('p')
                 ->where('p.id=:id')
                 ->leftJoin('p.dogs', 'dogs')
                 ->setParameter('id', $id)
                 ->getQuery()
                 ->getResult();
Всё, что после getRepository() стоит инкапсулировать в сам класс репозиторий. Но сам запрос не имеет смысла, вторая таблица тут ни на что не влияет.
Почем не имеет смысла? И что значит инкапсулировать в репозитрий? Как?
PS что-то типо такого:
PHP:
<?php

namespace Site\DeskBundle\Entity;

use Doctrine\ORM\EntityRepository;

class PostRepository extends EntityRepository
{
    public function getFullPost($id)
    {
        return $this
                    ->createQueryBuilder('p')
                    ->where('p.id=:id')
                    ->leftJoin('p.dogs', 'd')
                    ->setParameter('id', $id)
                    ->getQuery()
                    ->getSingleResult();
    }
}
?
 

Semen

Семён
в репозиторие создаёшь функцию с необходимым тебе запросом и в контролере вызываешь...
 

Вурдалак

Продвинутый новичок
Сверху