28

我是一个 symfony 初学者,我想用这个框架做一个博客。我使用存储库通过这种方法获取主页文章:

public function getHomeArticles($offset = null, $limit = null)
{
    $qb = $this->createQueryBuilder('a')
               ->leftJoin('a.comments', 'c')
               ->addSelect('c')
               ->addOrderBy('a.created', 'DESC');


    if (false === is_null($offset))
        $qb->setFirstResult($offset);

    if (false === is_null($limit))
        $qb->setMaxResults($limit);

    return $qb->getQuery()
              ->getResult();
}

所以在我的数据库中我有 10 篇文章。在我的 BlogController 我使用:

$blog = $em->getRepository('TestBlogBundle:Article')
                ->getHomeArticles(3,4);

有了这个,我想要 4 篇文章。但作为回报,我也有一篇文章。

问题是什么?

4

1 回答 1

43

如果您的查询包含 fetch-joined 集合,这是一个已知问题,需要小心使用。setFirstResult()setMaxResults()

如关于First 和 Max Result Items所述:

如果您的查询包含指定结果限制方法的 fetch-joined 集合,则无法按预期工作。Set Max Results 限制了数据库结果行的数量,但是在 fetch-joined 集合的情况下,一个根实体可能出现在许多行中,有效地水合少于指定数量的结果。

相反,您可以:

  1. 延迟加载

  2. 使用分页器(如@Marco 所述)

  3. 利用Doctrine\Common\Collections\Collection::slice()

于 2013-02-15T01:04:06.517 回答