2012-11-12 99 views
6

我正在使用Doctrine 2.2.2試圖爲用戶實體和用戶公司一起查詢。我希望這個查詢被緩存,因爲裏面的數據不會經常變化,如果有的話。以下是我所嘗試的:學說結果緩存沒有緩存加入查詢

$user = $em->createQuery(' 
    SELECT u, c 
    FROM Entities\User u 
    LEFT JOIN u.company c 
    WHERE u.id = :id 
')->setParameter('id', $identity)->useResultCache(true, 21600, 'user_' . $identity)->getResult(); 

表面上看,用戶實體被緩存,但它仍然爲公司查詢。有沒有一種方法可以同時獲取並將它們放入結果緩存中?

我確實找到了this,但是它已經很老了,他的解決方案並沒有爲我工作。

有人建議我做this,但這種做法會影響結果緩存的目的。

+0

我不知道學說,但你可以給MySQL的內部緩存中的嘗試:SELECT SQL_CACHE U,C 從實體\用戶U LEFT JOIN u.companyç WHERE u.id =:ID – nfo

+0

這是無益的。我希望能夠使用所有的學說實體的東西。 – tubaguy50035

+1

嘗試強制EAGER抓取(而不是懶惰)。您必須將fetch =「EAGER」添加到關係定義中。 – Cyprian

回答

1

我一直在使用與學說2.3測試此:

$q->setResultCacheDriver(new \Doctrine\Common\Cache\ApcCache()) 
    ->setResultCacheLifetime(21600) 
    ->setResultCacheId('user_' . $identity); 

當我運行它的第一次,我看到在我的sql記錄器的實際查詢。
當我運行它的第二,第三等時,我沒有看到我的sql記錄器中的任何東西。

我的結論是它工作正常。

我想你要麼沒有配置結果緩存,要麼你配置了非永久結果緩存(如ArrayCache),或者它是Dontrine 2.2.2中的一個錯誤(雖然我找不到關於它的任何事情)。 PS:我從另一個問題(Doctrine detaching, caching, and merging)收集到你已經升級到Doctrine 2.3。你還有這個問題嗎?

PPS:在Doctrine 2.0之後(我認爲它是2.2),結果緩存發生了變化。取代緩存水合結果,sql-result被緩存(每次運行都會發生水合)。如果你想緩存水合結果,你將不得不使用水合緩存(但是這些結果是合併到EntityManager的結果是而不是)。

+0

我的解決方案是創建我自己的「結果緩存」。這是另一個問題所在。 – tubaguy50035