我正在尝试找到一种方法,在访问邮政实体时可以产生较少的请求,并能够从该中获取上一条和下一条实体,现在我在与Twig相同的视图中所做的工作是通过以下方式获得的。
{% set next = next(post) %}
{% set prev = prev(post) %}
树枝扩展
public function next($post){
$nextPost = $this->em->getRepository('App:Post')->createQueryBuilder('b')
->where('b.id > :id')->setParameter('id', $post->getId())
->andWhere('b.visible = :visible')->setParameter('visible', true)
->orderBy("b.id","asc")
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
return $nextPost;
}
public function prev($post){
$prevPost = $this->em->getRepository('App:Post')->createQueryBuilder('b')
->where('b.id < :id')->setParameter('id', $post->getId())
->andWhere('b.visible = :visible')->setParameter('visible', true)
->orderBy("b.id","desc")
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
return $prevPost;
}
有一些方法可以用更少的mysql请求来获取它,并以这种特殊方式将其添加到Post对象中。
{{post.prev.title}}
{{post.next.title}}
答案 0 :(得分:2)
我能想到的唯一方法是在实体中存储对上一个/下一个对象的引用。然后,您可以使用联接来获取它们。
您还可以编写一个复杂的查询,该查询可以加载当前实体,还可以将两个查询作为子查询来执行,或者使用UNION来同时获取所有三个查询,但是我认为这将变得非常笨拙。
我不会担心这3个查询。将其合并为一个大查询将使其更难以阅读和调试,我怀疑性能提升是否会显着。除非您当前注意到这些查询对性能的影响,否则对其进行优化只会浪费您在其他方面花费的时间。您可以进行一些性能分析,例如,通过调查探查器工具栏中的性能和查询标签中的瓶颈。