我是一名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 ......)
你知道怎么做吗?
答案 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;