Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 条令查询生成器_Php_Symfony_Doctrine Orm - Fatal编程技术网

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

我是一名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;
}
$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()