在 Doctrine2 查询中使用 Limit 和 Offset

Posted

技术标签:

【中文标题】在 Doctrine2 查询中使用 Limit 和 Offset【英文标题】:Use Limit and Offset in Doctrine2 query 【发布时间】:2012-08-25 06:00:42 【问题描述】:

我正在尝试进行分页,但出现错误:

[语法错误] line 0, col 57: Error: Expected end of string, got 'limit'

我不太确定这是否是进行查询的正确语法(和逻辑):

public function getFriendsFromTo ($user, $limit, $offset)

     return $this->getEntityManager()
        ->createQuery('SELECT f FROM EMMyFriendsBundle:Friend f WHERE f.user='.$user.' limit '.$limit. 'offset' .$offset)
        ->getResult();

好友和用户关联manyToOne和oneToMany,所以在friends表中有一个字段——user_id。

这是在我的控制器中:

$user = $this->get('security.context')->getToken()->getUser();
$id = $user->getId();

$friends = $user->getFriends();
$result = count($friends)
$FR_PER_PAGE = 7;
$pages = $result/$FR_PER_PAGE;

$em = $this->getDoctrine()->getEntityManager();
$friends = $em->getRepository('EMMyFriendsBundle:Friend')
         ->getFriendsFromTo($id, $FR_PER_PAGE, $page*$FR_PER_PAGE); 

我知道这很愚蠢,甚至是错误的(尤其是第三个参数是$page*$FR_PER_PAGE),但我只是想试试查询是否有效,但它没有。

【问题讨论】:

什么意思?得到任何错误?您还应该使用setParameter("user", $user),而不是将其直接插入 DQL。此外,很高兴看到您的实体定义。编辑:刚刚看到编辑。 'offset' 后面应该有一个空格 是的,我收到一个错误 - 它在问题的开头。 您可能对这个捆绑包感兴趣:knpbundles.com/KnpLabs/KnpPaginatorBundle 谢谢 :) 但我更喜欢不打包,以便更好地理解它。 【参考方案1】:

不。使用:

  return $this->getEntityManager()
        ->createQuery('...')
        ->setMaxResults(5)
        ->setFirstResult(10)
        ->getResult();

【讨论】:

但是如何设置结果应该从哪里开始呢? 在 DQL 中使用 JOIN 时要小心。它不会按预期执行:docs.doctrine-project.org/projects/doctrine-orm/en/latest/… 有没有一种简单的方法,如何知道数据库中是否还有更多的实体?我的意思是,如果此查询的结果包含数据库中的最后一个实体。【参考方案2】:
$towary = $this->getDoctrine()
   ->getRepository('AcmeStoreBundle:Towar') 
   ->findBy(array(),array(),10,($current-1)*$numItemsPerPage);

【讨论】:

我发现这更有用,因为我想使用 findBy() 函数 请问$current 是什么?【参考方案3】:

可以使用findBy学说库方法的第3个和第4个参数,分别是limitoffset

这里是方法定义:

findBy(
    array        $criteria,
    array        $orderBy  = null, 
    integer|null $limit    = null,
    integer|null $offset   = null
)

来源:http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.EntityRepository.html

【讨论】:

【参考方案4】:

你也可以使用

$query->getSingleResult();

【讨论】:

【参考方案5】:

Doctrine2.6,偶然发现这篇旧帖子并尝试了 DQL 方式,但它不适合目的。因此,如果您想避免使用 DQL,因为您已经将实体映射并连接在一起,您可以使用 matching & Criteria

进行分页
$criteria = Criteria::create()
            ->setMaxResults($limit ? $limit : null)
            ->setFirstResult($offset ? $offset : null)
$result = $em->getRepository('EMMyFriendsBundle:Friend')
            ->matching($criteria)->toArray();

【讨论】:

以上是关于在 Doctrine2 查询中使用 Limit 和 Offset的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine 2.1 性能问题

Doctrine2 查询(Builder)在使用“where”和“in”子句后失去关系

Doctrine2:使用 NativeQuery 和 ResultSetMapping 进行查询

Doctrine2 - 一次多次插入

如何使用Symfony3在Doctrine2 Entity中运行查询查询

如何在 Doctrine2 的查询结果中获取 Collection