在实体发布之前和旁边添加新对象

时间:2018-11-16 01:25:13

标签: php symfony doctrine

我正在尝试找到一种方法,在访问邮政实体时可以产生较少的请求,并能够从该中获取上一条和下一条实体,现在我在与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}}

1 个答案:

答案 0 :(得分:2)

我能想到的唯一方法是在实体中存储对上一个/下一个对象的引用。然后,您可以使用联接来获取它们。

您还可以编写一个复杂的查询,该查询可以加载当前实体,还可以将两个查询作为子查询来执行,或者使用UNION来同时获取所有三个查询,但是我认为这将变得非常笨拙。

我不会担心这3个查询。将其合并为一个大查询将使其更难以阅读和调试,我怀疑性能提升是否会显着。除非您当前注意到这些查询对性能的影响,否则对其进行优化只会浪费您在其他方面花费的时间。您可以进行一些性能分析,例如,通过调查探查器工具栏中的性能和查询标签中的瓶颈。