Symfony 3 не может выполнить сложный запрос для работы с createQueryBuilder: должны отображаться рекомендуемые публикации в блогах

#sql #symfony #doctrine-orm #subquery #query-builder

#sql #symfony #doctrine-orm #подзапрос #конструктор запросов

Вопрос:

Я создаю веб-сайт блога, где пользователи могут размещать записи в блогах, содержащие множество категорий. Я хотел бы отображать рекомендуемые записи в блоге под каждым отдельным блогом. Рекомендуемые записи в блоге должны основываться на той же категории, что и запись в блоге, которую вы просматриваете.

Сначала я создал запрос в SQL, и он работает, но когда я пытаюсь реализовать в нем свой проект с помощью createQueryBuilder, я получаю все записи в блогах на сайте, а не только те, которые содержат ту же категорию.

Вот мой SQL-запрос:

 SELECT 
* 
FROM
blog b 
    INNER JOIN
blog_category bc ON b.id = bc.blog_id
    INNER JOIN
category c ON bc.category_id = c.id 
WHERE 
c.id IN (SELECT 
        c.id
    FROM
        blog b
            INNER JOIN
        blog_category bc ON b.id = bc.blog_id
            INNER JOIN
        category c ON bc.category_id = c.id
    WHERE
        b.id = 33) and b.id != 33 group by b.id
  

Как я уже сказал, этот запрос работает нормально, но когда я пытаюсь использовать его в моем проекте Symfony, он не работает.

    public function findRelatedBlogs($blog_Id)
{

    $qbCat = $this->_em->createQueryBuilder();
    $qbCat->select('ca.id')
        ->from('AppBundle:Blog', 'bl')
        ->join('bl.categories', 'ca')
        ->where('b.id =:blogid')
        ->setParameter('blogid', $blog_Id);

    $qb = $this->_em->createQueryBuilder();
    $qb->select('b')
        ->from('AppBundle:Blog', 'b')
        ->join('b.categories', 'c')
        ->where($qb->expr()->in('c.id', $qbCat->getDQL()))
        ->where('b.id !=:blogid')
        ->groupBy('b.id')
        ->setParameter('blogid', $blog_Id);
    return $qb->getQuery()->getResult();


}
  

Кажется, я не могу найти, что не так.

Комментарии:

1. На первый взгляд я не вижу ничего плохого, но что может быть полезно, так это использовать getSQL () вместо GetResult (), и тогда вы сможете увидеть условия SQL, выполняемые querybuilder. Довольно полезно для отладки того, что он на самом деле делает за кулисами и где он может не выдавать то, что вы ожидаете.

2. Всегда, когда я использую подвыборки в Doctrine, я делаю что-то вроде этого: in('c.id', '('.$qbCat->getDQL().')') . Тогда подвыборка находится между ( и ) тем, что требуется SQL для правильного синтаксиса.

3. Как упоминал @Richard, вы могли бы использовать getSQL() , а также вы могли бы проверить панель инструментов Symfony debug…

Ответ №1:

Okkey, у меня получилось, ребята, оказывается, я допустил опечатку в своем запросе subselect

  $qbCat = $this->_em->createQueryBuilder();
    $qbCat->select('ca.id')
        ->from('AppBundle:Blog', 'bl')
        ->join('bl.categories', 'ca')
        ->where('bl.id =:blogid')
        ->setParameter('blogid', $blog_Id);
  

Строка «-> где(‘b.id =:blogid’) » был неправильным, он должен был быть bl.id =:blogid. Не удалось найти идентификатор из-за этой ошибки, которую я допустил..

Спасибо за помощь, ребята 🙂