· блоги, · Im создание веб-сайта блог, где пользователи могут оставлять BlogPost, которые содержат много категорий. Я бы хотел показать рекомендуемый блогпост под каждым отдельным блогом. Рекомендуемые blogposts должны основываться на том, чтобы иметь ту же категорию, что и блогпост, на который вы смотрите.Symfony 3 Не удается получить сложный запрос для работы с createQueryBuilder: следует отображать рекомендуемые
Я сначала сделал запрос в 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();
}
Я не могу найти что-то не так.
На первый взгляд, я не вижу ничего плохого, но то, что может быть полезным является использование getSQL() вместо из getResult(), а затем вы можете увидеть условия SQL, которые создает querybuilder. Весьма полезно для отладки того, что он фактически делает за кулисами, и где он может не производить то, что вы ожидаете. – Richard
Всегда, когда я использую subselects в Doctrine, я делаю что-то вроде этого: 'in ('c.id', '('. $ QbCat-> getDQL(). ')')'. Затем subselect находится между '(' и ')', что SQL требует для правильного синтаксиса. –
Как упоминал @Richard, вы можете использовать 'getSQL()', а также можете проверить панель инструментов отладки Symfony ... –