2012-10-10 125 views
0

我有一個網站是我玩的視頻遊戲,並且正致力於通過實施一些額外的緩存來提高網站的性能。我已經能夠在自定義存儲庫函數上實現查詢結果緩存,但是無法找到解釋如何將查詢結果緩存包含在內置函數(findOneById等)中的任何地方。我對這樣做感興趣,因爲我的許多數據庫查詢都是從這些「本地」存儲庫函數中執行的。如何爲內置的doctrine2存儲庫函數設置查詢緩存結果?

因此,作爲一個例子,我有以下屬性的字符實體對象:ID,名稱,種族,階級等

種族和階級在這個對象是種族和階級反對其他實體引用。 當我加載一個字符進行顯示時,我通過名稱(findOneByName)得到了字符,然後在我的模板中顯示了角色的種族/類別$characterObject->getRace()->getName()。模板中的這些方法調用將導致查詢在我的Race/Class實體表上按id(findOneById,我假設)獲取實體。

我試圖在存儲庫中創建自己的findOneById函數,但在這種情況下不會調用它。

如何設置doctrine/symfony,使這些查詢結果可以緩存?

我運行的Symfony 2.1.3和學說2.3.x版本

回答

1

我發現無法在函數中的doctrine構建中啓用查詢緩存。我會發佈一個鏈接,解釋爲什麼後來我再次找到它。

0

你的實體可能是這個樣子:

MyBundle\Entity\Character: 
    type: entity 
    table: Character 
    fields: 
     id: 
     id: true 
     type: bigint 
     name: 
     type: string 
     length: 255 
    manyToOne: 
     race: 
     targetEntity: Race 
     joinColumns: 
      raceId: 
      referencedColumnName: id 

MyBundle\Entity\Race: 
    type: entity 
    table: Race 
    fields: 
     id: 
     id: true 
     type: bigint 
     name: 
     type: string 
     length: 255 
    oneToMany: 
     characters: 
     targetEntity: Character 
     mappedBy: race 

如果是這樣的話,那麼這樣它急切地修改你的字符實體映射加載種族實體以及:在fetch選項

MyBundle\Entity\Character: 
    ... 
    manyToOne: 
     race: 
     targetEntity: Race 
     joinColumns: 
      raceId: 
      referencedColumnName: id 
     fetch: EAGER 

主義文檔:@ManyToOne

+0

Eager fetch並不能幫助我緩存。在激活時,它不會更改執行的查詢數或緩存結果。我的問題的一部分是每年有6次左右的比賽,我想緩存比賽信息,這樣它就可以在任何角色上重複使用,無論上下文如何(角色簡介,公會成員名單等) )。我試圖避免寫每個頁面的數據需要特定的DQL ...我相信這是最有效的解決方案,但我試圖簡化。 – Chris