РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
37 of 258 menu

Метод join класса QueryBuilder

Метод join класса QueryBuilder присоединяет связанную сущность к основному запросу через SQL-соединение. Первым параметром передаётся поле связи, вторым - псевдоним присоединяемой сущности, третьим - тип соединения (Expr\Join::INNER_JOIN или Expr\Join::LEFT_JOIN), четвёртым - условие соединения при необходимости.

Синтаксис

$qb->join(join, alias, conditionType, condition, indexBy)

Пример

Давайте соединим сущность Article с сущностью User через поле связи author и получим имя автора:

<?php namespace App\Controller; use App\Entity\Article; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article', name: 'article_index')] public function index(EntityManagerInterface $em): Response { $qb = $em->createQueryBuilder(); $qb->select('a.title', 'u.name') ->from(Article::class, 'a') ->join('a.author', 'u'); $res = $qb->getQuery()->getResult(); return new Response(json_encode($res)); } } ?>

Результат выполнения кода:

[{"title": "article", "name": "abcde"}]

Пример

Давайте выполним LEFT JOIN, чтобы получить статьи даже без автора:

<?php namespace App\Controller; use App\Entity\Article; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Query\Expr\Join; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article-left', name: 'article_left')] public function left(EntityManagerInterface $em): Response { $qb = $em->createQueryBuilder(); $qb->select('a.title', 'u.name') ->from(Article::class, 'a') ->leftJoin('a.author', 'u'); $res = $qb->getQuery()->getResult(); return new Response(json_encode($res)); } } ?>

Результат выполнения кода:

[{"title": "article", "name": "abcde"}, {"title": "user", "name": null}]

Пример

Давайте добавим условие соединения через четвёртый параметр:

<?php namespace App\Controller; use App\Entity\Article; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Query\Expr\Join; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article-cond', name: 'article_cond')] public function cond(EntityManagerInterface $em): Response { $qb = $em->createQueryBuilder(); $qb->select('a.title', 'u.name') ->from(Article::class, 'a') ->join('a.author', 'u', Join::WITH, 'u.active = :active') ->setParameter('active', true); $res = $qb->getQuery()->getResult(); return new Response(json_encode($res)); } } ?>

Результат выполнения кода:

[{"title": "article", "name": "abcde"}]

Смотрите также

  • класс QueryBuilder,
    который строит DQL-запросы
  • метод innerJoin,
    который выполняет INNER JOIN
  • метод leftJoin,
    который выполняет LEFT JOIN
  • метод where,
    который задаёт условие фильтрации
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить