Php 条令查询生成器
我是一名Symfony初学者&我正试图使用Doctrine Query Builder从数据库中加载我的联系人,如下所示: ContactRepository.php:Php 条令查询生成器,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我是一名Symfony初学者&我正试图使用Doctrine Query Builder从数据库中加载我的联系人,如下所示: ContactRepository.php: public function getcontactByLimit($offset, $limit) { $queryBuilder = $this->_em->createQueryBuilder() ->select('contact') ->from($thi
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;
}
$contacts = $repository->getContactByLimit(0, 3);
DefaultController.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;
}
$contacts = $repository->getContactByLimit(0, 3);
现在我想获得数据库中的所有联系人,但只有3乘3,这意味着我应该在每个循环中更改偏移值(先更改为3,然后更改为6,然后更改为9…)
你知道怎么做吗?在我看来,你想把对象分成几部分加载以节省内存 为此,可以使用迭代器:
$query = $queryBuilder->getQuery();
$iterator = $query->iterate();
return $iterator;
并在控制器中迭代
foreach ($iterator as $row) {
}
将会发生的是,条令使用PDO并选择您的结果,但不直接读出结果。在数据库的结果集上有一个光标,它在每次迭代中都会移动。所以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;
}
在我看来,您似乎希望以部分方式加载对象以节省内存 为此,可以使用迭代器:
$query = $queryBuilder->getQuery();
$iterator = $query->iterate();
return $iterator;
并在控制器中迭代
foreach ($iterator as $row) {
}
将会发生的是,条令使用PDO并选择您的结果,但不直接读出结果。在数据库的结果集上有一个光标,它在每次迭代中都会移动。所以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;
}
我就是这么做的&效果很好 DefaultController.php:
$offset = 0;
$limit = 2;
$sizeData /= $limit;
for( $i = 0; $i < $sizeData; $i++)
{
$contacts = $repository->getListByLimit($offset, $limit);
$sender->setContacts($contacts);
$offset += $limit;
}
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;
我就是这么做的&效果很好 DefaultController.php:
$offset = 0;
$limit = 2;
$sizeData /= $limit;
for( $i = 0; $i < $sizeData; $i++)
{
$contacts = $repository->getListByLimit($offset, $limit);
$sender->setContacts($contacts);
$offset += $limit;
}
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;
现在我想获取数据库中的所有联系人,但只需3乘3。您想从哪里获取联系人?您可以执行
$contactsPage1=$repository->getContactByLimit(0,3)$contactsPage2=$repository->getContactByLimit(3,3)
但我认为这并不是您想要实现的。还有一些其他事情-您正在检查$offset
和$limit
上的是否为null,但它们是函数中的必需值,并且始终为非null。您还缺少一个代码>在您的createQueryBuilder()
functionYes@Pipe的末尾,这将无法工作,因为我的数据库太大(1000或更多)。@JasonRoman您说得对,我现在已经更正了,谢谢您,&谢谢代码>我不认为这是必要的。为什么不把所有的行都取出来,然后在foreach
循环中将它们按3分组?您正在尝试创建分页吗?现在我想获取数据库中的所有联系人,但只需3乘3。您想从哪里获取这些联系人?您可以执行$contactsPage1=$repository->getContactByLimit(0,3)$contactsPage2=$repository->getContactByLimit(3,3)
但我认为这并不是您想要实现的。还有一些其他事情-您正在检查$offset
和$limit
上的是否为null,但它们是函数中的必需值,并且始终为非null。您还缺少一个代码>在您的createQueryBuilder()
functionYes@Pipe的末尾,这将无法工作,因为我的数据库太大(1000或更多)。@JasonRoman您说得对,我现在已经更正了,谢谢您,&谢谢代码>我不认为这是必要的。为什么不把所有的行都取出来,然后在foreach
循环中将它们按3分组?您正在尝试创建分页吗?关于使用iterator()
的好建议关于使用iterator()