簡體   English   中英

原則查詢生成器偏移量可變

[英]Doctrine query builder offset changeable

我是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 x 3,這意味着我應該在每個循環中更改偏移值(依次為3、6、9 ...)

你知道怎么做嗎?

在我看來,您想部分裝入對象以節省內存。

為此,您可以使用Iterator:

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

並在您的控制器中進行迭代

foreach ($iterator as $row) {

}

將會發生的事情是,該學說使用PDO並選擇您的結果,而不是直接讀出。 在數據庫的ResultSet上有一個光標,該光標在每次迭代時都在移動。 因此,您的PHP應用程序將一一獲取數據庫中的每一行。 要獲得3 x 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;
    }

那就是我所做的,而且效果很好!

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM