2012-07-17 22 views
1

我怎樣才能使學說1.2類似於經典的PHP PDO如何在Doctrine 1.2中逐個獲取結果?

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

東西。

我已經試過

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

,但它始終只返回第一個對象中找到。

有什麼辦法可以實現這種行爲?

我的查詢並不重要。這是一個普通的簡單的(注意,我在*表類模型)

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

回答

0

你試過:

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

如果你想要,而不是獲取對象的數組:

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

我現在想,但我認爲$查詢 - >執行()返回所有集合所以沒有用的,而 – 2012-07-17 14:00:15

+0

這沒有按我的意願工作。因爲Doctrine_Collection使用太多內存。我想作爲分類PDO來像邏輯和sql之間的緩衝區一樣工作。檢索一個對象並使用它進行處理。不管怎麼說,還是要謝謝你。 – 2012-07-17 14:08:41

+0

您仍然可以查看[doc](http://doctrine.readthedocs.org/en/latest/en/manual/dql-doctrine-query-language.html#select-queries)。 – j0k 2012-07-17 14:09:45

1

在symfony2中處理遷移命令時,我發現$query->executes();在返回之前將完整的結果集提取到RAM中。

這對於少量數據來說不是問題,但是如果結果更大,那麼您的進程可能會運行OutOfMemory。

爲了解決您可以通過結果「一一」這個說法迭代問題:

$query->iterate(); 

我的事了similare這個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找到此。

+1

這是爲學說2,OP要求學說1。 – j0k 2012-12-08 10:53:40

+0

Ups!是的,你是對的,我在谷歌搜索教條解決方案時偶然發現了這個答案(2)。 – Alex 2012-12-10 10:52:43

0

如果你有連接,像這樣做:

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

隨着fetchOne()你只會得到一個條目都沒有。

0

使用水合物模式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

相關問題