Метод 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,
который задаёт условие фильтрации