Doctrine查询构建器偏移量可更改

时间:2016-02-11 17:31:51

标签: php symfony doctrine-orm

我是一名Symfony初学者&我尝试使用Doctrine Query Builder从数据库加载我的联系人,如下所示:

ContactRepository.php

public function getcontactByLimit($offset, $limit)
{
    $queryBuilder = $this->_em->createQueryBuilder()
        ->select('contact')
        ->from($this->_entityName, 'contact')
        ->setFirstResult( $offset )
        ->setMaxResults( $limit )

      $query = $queryBuilder->getQuery();
      $results = $query->getResult();

    return $results;
}

DefaultController.php

$contacts = $repository->getContactByLimit(0, 3);

现在我想获得我在数据库中的所有联系人,但只有3比3,这意味着我应该在每个循环中更改偏移值(到3然后是6然后是9 ......)

你知道怎么做吗?

2 个答案:

答案 0 :(得分:2)

对我来说,您希望在零件中加载对象以节省内存。

为此,您可以使用迭代器:

  $query = $queryBuilder->getQuery();
  $iterator = $query->iterate();
  return $iterator;

在Controller中迭代

foreach ($iterator as $row) {

}

会发生什么,是该学说使用PDO并选择你的结果但不直接读出来。数据库的ResultSet上有一个游标,每次迭代都会移动。因此,您的PHP应用程序将逐个从数据库中获取每一行。 要获得3乘3的包,您可以使用内部位置:

    $currentPackage = array();
    foreach ($iterator as $position => $row) {
        if($position % 3){
            // do here something with your 3er package before unset
            $currentPackage = array();
            $entityManager->clear(); // clear doctrine, could free memory
        }
        $currentPackage[] = $row;
    }

答案 1 :(得分:0)

我做了什么,&它工作正常!

<强> DefaultController.php:

        $offset = 0;
        $limit = 2;
        $sizeData /= $limit;

        for( $i = 0; $i < $sizeData; $i++)
        {
            $contacts = $repository->getListByLimit($offset, $limit);
            $sender->setContacts($contacts);
            $offset += $limit;
        }

<强> ContactRepository.php:

public function getListByLimit($offset, $limit)
    {
        $queryBuilder = $this->_em->createQueryBuilder()
            ->select('contact')
            ->from($this->_entityName, 'contact')
            ->setFirstResult( $offset )
            ->setMaxResults( $limit );

        $query = $queryBuilder->getQuery();
        $results = $query->getResult();
        return $results;