@urajo

Как сделать несколько вложенных джоинов?

Есть таблица, в которой есть столбцы authorId и executorId, они ведут к другой таблице People.
Мне нужно через таблицу People сделать серч по имени и вернуть все таски которые есть
$qb->expr()->like('pa.fullName', ':search'),
Для этого я делаю так
Но получаю ошибку
[Doctrine\ORM\Query\QueryException] - [[Semantical Error] line 0, col 123 near 'pa.fullName LIKE': Error: 'pa' is not defined.] - [/var/www/html/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php] - [45] - [2023-12-11]

$qb = $this->createQueryBuilder('n')
      ->select('n', 'a', 'e', 'pa', 'pe', 's')
      ->where('n.authorId = :id OR n.executorId = :id')
      ->orderBy("n.{$order[0]}", $order[1])
      ->leftJoin('n.authorId', 'a')
      ->leftJoin('n.executorId', 'e')
      ->leftJoin('a.peopleId', 'pa')
      ->leftJoin('e.peopleId', 'pe')
      ->leftJoin('n.statusId', 's')
      ->setParameter('id', $userId);
 
    if($offset) {
      $qb->setFirstResult($offset);
    }
 
    if($limit) {
      $qb->setMaxResults($limit);
    }
 
    if($query) {
        $qb->andWhere(
          $qb->expr()->orX(
            $qb->expr()->like('pa.fullName', ':search'),
            $qb->expr()->like('pe.fullName', ':search'),
          )
        )->setParameter('search', '%' . $query . '%');
      }
  • Вопрос задан
  • 93 просмотра
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Сначала напишите чистый SQL:
select n.*, -- атрибуты новости
           p1.*, -- атрибуты автора
           p2.*, -- атрибуты исполнителя
           s.* -- атрибуты статуса новости
from news n
join status s on s.statusId = n.statusId
left join people p1 on p1.peopleId = n.authorId
left join people p2 on p2.peopleId = n.executorId
where p1.fullName like :search
       or p2.fullName like :search

Потом откройте документацию по ORM и перепишите в методологии ORM.
Сначала попробуйте простой запрос:
select *
from news

Потом посмотрите, как делать join и работать с псевдонимами таблиц:
select n.*, -- атрибуты новости
           s.* -- атрибуты статуса новости
from news n
join status s on s.statusId = n.statusId

Потом как с where работать:
select n.*, -- атрибуты новости
           s.* -- атрибуты статуса новости
from news n
join status s on s.statusId = n.statusId
where s.statusId = :statusId

Потом, как лайкать:
select n.*, -- атрибуты новости
           p1.*, -- атрибуты автора
           p2.*, -- атрибуты исполнителя
           s.* -- атрибуты статуса новости
from news n
join status s on s.statusId = n.statusId
left join people p1 on p1.peopleId = n.authorId
where p1.fullName like :search

И в заключение, как к лайкам добавить OR (самый первый запрос).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы