2013-03-15 40 views
0

我有一個Propel 1.6生成的類組,它與Inits有關,並且Inits有與它們相關的Resps。非常簡單。獲取相關對象時,Propel是否緩存條件?

我不明白這兩個Propel代碼之間的區別。在第一個循環中,我重新創建了$notDeleted標準。這段代碼做我想要的 - 它將所有的Resps放入$data陣列中。

foreach ($group->getInits() as $init) { 
    $notDeleted = RespQuery::create()->filterByIsDeleted(false); 
    foreach ($init->getResps($notDeleted) as $resp) { 
     $data[] = $resp; 
    } 
} 

在這裏,在第二個代碼,我有$notDeleted標準拉出循環,爲的(我認爲是)很明顯效率的原因。此代碼不按我想要的方式工作 - 它僅從Inits中的一個獲取Resps。

$notDeleted = RespQuery::create()->filterByIsDeleted(false); 
foreach ($group->getInits() as $init) { 
    foreach ($init->getResps($notDeleted) as $resp) { 
     $data[] = $resp; 
    } 
} 

我想這一定是什麼做的getResps()方法如何存儲的結果,但事實並非文檔或代碼如何在該方法讀取。文檔和代碼表示,如果傳遞到getResps()的標準不爲null,它將始終從數據庫獲取結果。也許一些其他Propel緩存?

回答

1

(首先,我猜你的意思是使用$init與您的循環$initiative這還是有我們沒有在這裏看到一些其他的代碼。)

這裏是我的猜測:在你的第二個例子中,你拉出$notDeletedCriteria對象,但每次通過內部foreach調用getResps($notDeleted)將使得Propel在Criteria實例上使用當前的Init實例執行filterByInit()實例。這將爲SQL添加一個新的WHERE條件,但顯然Resp只能有一個Init.Id值,因此是唯一的結果。

我不認爲有很好的理由可以解決這個問題,但是Propel只是創建一個新的Criteria對象,克隆你傳入的對象 - 因此沒有保存真正的內存。

+0

(是的,你是對的變量名稱,感謝j0k清理它。)我有點看到你在說什麼。但我會期望Propel生成一個新的WHERE Init.Id =?每次在循環中調節。但我猜這是不是這樣做? – matt 2013-03-15 21:26:54

+0

我不認爲這會......但我不是100%確定。還有其他的事情可以做,但即使如此,我認爲這不是你的代碼是罪魁禍首。 – jakerella 2013-03-15 21:47:03