2016-10-20 2 views
0

· блоги, · 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(); 


} 

Я не могу найти что-то не так.

+1

На первый взгляд, я не вижу ничего плохого, но то, что может быть полезным является использование getSQL() вместо из getResult(), а затем вы можете увидеть условия SQL, которые создает querybuilder. Весьма полезно для отладки того, что он фактически делает за кулисами, и где он может не производить то, что вы ожидаете. – Richard

+0

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

+0

Как упоминал @Richard, вы можете использовать 'getSQL()', а также можете проверить панель инструментов отладки Symfony ... –

ответ

0

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

$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. Он не мог найти идентификатор из-за этой ошибки я сделал ..

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

Смежные вопросы