我有一个有效的queryBuilder,它按类别获取帖子并排除正在显示的帖子并设置最大限制。
问题:如何简化此queryBuilder?
在查询中,我很确定我不需要加入2个表(类别/帖子与OneToMany / ManyToOne关系连接)并在控制器中设置$ category,是否有更好的方法重构这个?
的QueryBuilder
public function getRelatedPosts($exceptPost, $limit, $category)
{
return $this
->createQueryBuilder('post')
->leftJoin('post.category','category')
->where('post != :exceptPost')
->setParameter('exceptPost', $exceptPost)
->andWhere('category = :category')
->setParameter('category', $category)
->orderBy('post.createdAt', 'DESC')
->setMaxResults($limit)
->getQuery()
->execute();
}
控制器
public function showAction($slug)
{
$post = $this->getDoctrine()->getRepository('AcmeDemoBundle:Post')
->findOneBy(array(
'slug' => $slug
));
if (null === $post) {
throw $this->createNotFoundException('Post was not found');
}
$category = $post->getCategory();
$posts = $this->getDoctrine()->getRepository('AcmeDemoBundle:Post')
->getRelatedPosts($post, 4, $category);
return array(
'post' => $post,
'posts' => $posts
);
}
更新了queryBuilder
public function getRelatedPosts($exceptPost, $limit, $category)
{
return $this
->createQueryBuilder('post')
->where('post != :exceptPost')
->andWhere('post.category = :category')
->setParameter('exceptPost', $exceptPost)
->setParameter('category', $category)
->orderBy('post.createdAt', 'DESC')
->setMaxResults($limit)
->getQuery()
->execute();
}
答案 0 :(得分:1)
我不确定这是否是你要找的东西,但你可能想要这样的东西:
的控制器强>
public function showAction($slug)
{
$post = $this->getDoctrine()->getRepository('AcmeDemoBundle:Post')
->findOneBy(array(
'slug' => $slug
));
if (null === $post) {
throw $this->createNotFoundException('Post was not found');
}
$posts = $this->getDoctrine()->getRepository('AcmeDemoBundle:Post')
->getRelatedPosts($post, 4);
return array(
'post' => $post,
'posts' => $posts
);
}
<强>存储库强>
public function getRelatedPosts($exceptPost, $limit)
{
return $this
->createQueryBuilder('post')
->where('post.id != :exceptPost')
->andWhere('post.category = :category')
->setParameter('exceptPost', $exceptPost->getId())
->setParameter('category', $exceptPost->getCategory()->getId())
->orderBy('post.createdAt', 'DESC')
->setMaxResults($limit)
->getQuery()
->getResult();
}
你也可以在post表的连接查询中用它自己或SELECT ... IN(...);如果你有兴趣