[英]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.