【问题标题】:How to fetch results one by one in Doctrine 1.2?如何在 Doctrine 1.2 中一一获取结果?
【发布时间】:2012-07-17 13:41:26
【问题描述】:

如何制作类似于经典 PHP PDO 的东西

while ($obj = $stmt->fetch()) {...}

在教义 1.2 中。

我试过了

while ($obj = $query->fetchOne()) {...} 

但它总是只返回找到的第一个对象。

有什么方法可以实现这种行为吗?

我的查询并不重要。很简单(注意我是模型的*Table类)

$query = $this->createQuery('a');

【问题讨论】:

    标签: php doctrine dql doctrine-1.2


    【解决方案1】:

    在 symfony2 中处理迁移命令时,我发现$query->executes(); 在返回之前将完整的结果集提取到 RAM 中。

    这不是少量数据的问题,但如果结果较大,您的进程可能会运行 OutOfMemory。

    要解决该问题,您可以使用以下语句“逐一”迭代结果:

    $query->iterate();
    

    我认为它类似于此 PDO 声明:while ($obj = $stmt->fetch()) {...}

    更完整的示例可能如下所示:

    $em = $this->getContainer()->get('doctrine');
    $iterator = $em->getRepository('AcmeBundle:Entity')
                   ->createQueryBuilder('e')
                   ->getQuery()->iterate();
    
    foreach($iterator as $item){
       $item = $item[0];
    
       // Your logic here:
       $item->getId();
       ....       
    }
    

    doctrine documentation 中找到此内容。

    【讨论】:

    • 这是为教义 2,OP 要求为教义 1。
    • 起来!是的,你是对的,我在搜索学说 (2) 中的解决方案时偶然发现了这个答案。
    【解决方案2】:

    你试过了吗:

    while ($obj = $query->execute()) {...}
    

    如果你想获取一个数组而不是对象:

    while ($obj = $query->execute(array(), Doctrine_Core::HYDRATE_ARRAY)) {...}
    

    【讨论】:

    • 我现在正在尝试,但我认为 $query->execute() 返回所有集合,所以暂时没有用
    • 这不像我希望的那样工作。因为 Doctrine_Collection 使用了太多内存。我想做一个经典的 PDO,像逻辑和 sql 之间的缓冲区一样工作。检索一个对象并处理它。无论如何,谢谢。
    • 您仍然可以查看doc
    • 离题 - 不知道这是否可以问。但我看到你对 symfony 有一些经验。你知道有什么部署工具可以和 symfony 和 git/svn 一起使用吗?
    • 哇.. 第一眼看起来很棒。适用于 1 和 2 平方英尺。还有一个问题,因为这是我第一次使用部署工具。在 capifony 中,当我自动部署时它会运行迁移?
    【解决方案3】:

    如果你有连接,这样做:

    $stmt = $conn->query($queryString);
    while ($obj = $stmt->fetch()) {...} 
    

    使用fetchOne(),您将只能获得一个条目。

    【讨论】:

      【解决方案4】:

      使用水合物模式Doctrine_Core::HYDRATE_ON_DEMAND

      $q = Doctrine_Query::create()
                      ->select('...')
                      ->from('...');
      
      // Returns instance of Doctrine_Collection_OnDemand
      $result = $q->execute(array(), Doctrine_Core::HYDRATE_ON_DEMAND);
      foreach ($result as $obj)
      {
          // do something with your object
      }
      

      更多信息:Data Hydrators — Doctrine 1.2.4 documentation

      【讨论】:

        猜你喜欢
        • 2017-08-12
        • 1970-01-01
        • 1970-01-01
        • 2015-03-27
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 2019-09-30
        相关资源
        最近更新 更多