2016-10-20 3 views
0

多くのカテゴリを含むブログポストを投稿できるブログWebサイトを構築します。別のブログの下に推奨ブログポストを表示したいと思います。推奨されるブログポストは、あなたが見ているブログポストと同じカテゴリを持つことに基づいている必要があります。Symfony 3 createQueryBuilderで動作する複雑なクエリを取得できません。推奨されるブログポストを表示する必要があります

私はSQLで最初にクエリを作成しましたが、その中でcreateQueryBuilderを使用してプロジェクトを実装しようとすると、同じカテゴリを含むブログポストだけでなく、サイトのすべてのブログポストが取得されます。

は、ここに私のSQLクエリです:私はこのクエリは正常に動作しますが、私は私のsymfonyプロジェクトでそれを使用しようとしているとき、それは動作しません言ったように

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

を私が作ったので、この間違いのIDを見つけることができませんでしたgetResult()を実行すると、querybuilderが作成しているSQL条件を見ることができます。実際に舞台裏でやっていることをデバッグするのに便利です。 – Richard

+0

常にDoctrineで副選択を使うとき、私はそのようなことをします: 'in '' c.id '、'( '。$ qbCat-> getDQL()。') ')'。次に、副選択は '('と ')'の間にあり、SQLが正しい構文に必要なものです。 –

+0

@リチャードが言及したように、あなたは '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。それは代わりに)私が間違って何も表示されませんが、何の役に立つかもしれないがgetSQLを(使用している一見..ヘルプみんなのため

感謝:)

関連する問題