Symfony2 - 如何简化此查询构建器?

时间:2014-07-21 10:54:00

标签: symfony doctrine-orm query-builder

我有一个有效的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();
}

1 个答案:

答案 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(...);如果你有兴趣