#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. Не удалось найти идентификатор из-за этой ошибки, которую я допустил..
Спасибо за помощь, ребята 🙂