Как добиться соединения в DQL?

Мне нужно выполнить простой запрос в Доктрина (используя Symfony 3.3).

У меня есть таблица «Статьи», которая содержит описание, и таблица «Пакеты», которая содержит идентификатор, соответствующий описанию статьи. В стандартном SQL это очень просто

SELECT p.article_id, a.description 
FROM Articles a 
JOIN Packets p 
ON p.article_id=a.id

Как это сделать в учении? Я почти все перепробовала, но ничего не работает! Пожалуйста помоги

Можете ли вы подробно рассказать, что вы пробовали и какая ошибка возникла?

j-guyon 13.04.2018 10:41

Не могу много сказать, не видя своих сущностей и отношений.

emix 13.04.2018 10:43

Покажите, пожалуйста, ваше отображение объекта.

EmilCataranciuc 13.04.2018 12:20
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
35
2

Ответы 2

Попробуйте методы доктрины магии

В контроллере что-то вроде:

$em = $this->getDoctrine()->getManager();
$packets =  $em->getRepository('NameOfYourBundle:Packets')->findByArticles($id);

Код из проекта Zend, хотя я полагаю, что для Symfony он не сильно отличается.

С QueryBuilder в функции (например, в функции репозитория) где-нибудь:

// These use statements to indicate which to use in case of duplicate class names
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Query\Expr\Join;

$qb = $this->createQueryBuilder('p'); //"p" for packet
$qb->select('p.description', 'art.id')
    ->join(
    'p.article',         // "p" for Packet Entity. "article" for property on Packet Entity
    'art',               // "art" as short name for relation
    Join::WITH,          // Join type
    'art.id = :article'  // the param on which should the join occur
)
    ->setParameter('article', $article); // Set the param with an instance

$result =  $qb->getQuery()->getResult(); // Get the result

Если это двунаправленная связь, вы можете просто использовать функции EntityRepository по умолчанию, предоставляемые Doctrine.

Такой как:

$packets = $this->getObjectManager()->getRepository(Packet::class)->findBy(['article' => $article->getId()]);

При правильной настройке в Entity это еще проще:

$packets = $article->getPackets();

Другие вопросы по теме