2016-10-20 6 views
0

많은 카테고리가 포함 된 블로그 포스트를 게시 할 수있는 블로그 웹 사이트를 구축하십시오. 각 블로그별로 권장 블로그 포스트를 표시하고 싶습니다. 권장 블로그 포스트는보고있는 블로그 포스트와 동일한 카테고리를 기반으로해야합니다.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 

.

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

에 대한

감사합니다() 대신 getResult() & querybuilder가 만드는 SQL 조건을 볼 수 있습니다. 배후에서 실제로하고있는 일과 기대하는 바를 산출하지 못하는 부분을 디버깅하는 데 매우 유용합니다. – Richard

+0

Doctrine에서 subselect를 사용할 때 항상 다음과 같이 만듭니다. '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. 이 실수를 내가 만든 때문에 ID를 찾을 수 없습니다 .. 도움들 : 나는 일이 잘못 표시되지 않습니다,하지만이 getSQL을 사용하고 유용 할 수 있습니다 눈에서