相关疑难解决方法(0)

教条2:限制左联/分页 - 最佳实践

我有一个大查询(在我的查询构建器中)和很多左连接.所以我得到他们的评论和标签等文章.假设我有以下dql:

$dql = 'SELECT blogpost, comment, tags 
FROM BlogPost blogpost 
LEFT JOIN blogpost.comments comments
LEFT JOIN blogpost.tags tags';
Run Code Online (Sandbox Code Playgroud)

现在让我们说我的数据库有超过100个博客帖子,但我只想要前10个,但是包含那些10及其所有标签的所有评论,如果它们存在的话.如果我使用setMaxResults它限制行.所以我可能得到前两个帖子,但最后一个帖子缺少一些评论或标签.所以跟随不起作用.

$result = $em->createQuery($dql)->setMaxResults(15)->getResult();
Run Code Online (Sandbox Code Playgroud)

使用doctrine2.2附带的几乎没有文件记录的分页解决方案对我来说并不是真的有效,因为它太慢了,我也可以加载所有数据.

我在Stackoverflow文章中尝试了解决方案,但即使该文章仍然缺少最佳实践,所提出的解决方案也非常慢.

对于如何做到这一点,是否有最佳实践?没有人在生产模式下使用Doctrine2.2吗?

pagination subquery query-builder database-performance doctrine-orm

7
推荐指数
1
解决办法
5761
查看次数

当Doctrine查询已加入时,setMaxResults不能正常工作

我想编写一个DQL查询,该查询选择发布并加入另一个实体。

这是我的代码:

   $dql = '
                    SELECT p , h ,t ,m 
                    FROM App:Post p 
                    LEFT JOIN p.mentions m
                    LEFT JOIN p.tags t 
                    LEFT JOIN p.file h 
                    WHERE p.user
                    IN (
                        SELECT f FROM App:User u
                        JOIN u.followers f
                        WHERE u.id = :uid
                       )
                    OR p.user = :uid ';

    $query = $this->getEntityManager()
        ->createQuery($dql)
        ->setMaxResults(5)
        ->setParameters(['uid' => $user->getId()])
        ->getArrayResult();
Run Code Online (Sandbox Code Playgroud)

但是问题是setMaxResults并没有限制posts实体,而是将标签Entity限制为5。

这是我的两种结果:

1. with setMaxResults(无法正常工作)

2. with setMaxResults(工作正常)

我的代码有什么问题?

php symfony doctrine-orm

4
推荐指数
1
解决办法
1330
查看次数