多くのカテゴリを含むブログポストを投稿できるブログ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();
}
私は間違ったものを見つけることができません。
を私が作ったので、この間違いのIDを見つけることができませんでしたgetResult()を実行すると、querybuilderが作成しているSQL条件を見ることができます。実際に舞台裏でやっていることをデバッグするのに便利です。 – Richard
常にDoctrineで副選択を使うとき、私はそのようなことをします: 'in '' c.id '、'( '。$ qbCat-> getDQL()。') ')'。次に、副選択は '('と ')'の間にあり、SQLが正しい構文に必要なものです。 –
@リチャードが言及したように、あなたは 'getSQL()'を使うことができますし、Symfonyデバッグツールバーをチェックすることもできます... –