如何为内置的doctrine2存储库函数设置查询缓存结果?

时间:2012-10-10 23:34:55

标签: caching symfony doctrine-orm

我有一个网站,用于我玩的视频游戏,并正在通过实施一些额外的缓存来改善网站的性能。我已经能够在自定义存储库函数上实现查询结果缓存,但是无法在任何地方找到解释如何在内置函数(findOneById等)中包含查询结果缓存的地方。我很感兴趣这样做,因为我的许多数据库查询都是从这些“本机”存储库函数执行的。

作为示例,我有一个具有以下属性的字符实体对象:id,name,race,class等。

此对象中的Race和class是对race和class的其他实体对象的引用。 当我加载一个字符进行显示时,我按名称获取字符(findOneByName),然后在我的模板中,我按$characterObject->getRace()->getName()显示字符的种族/类。模板中的这些方法调用导致在我的Race / Class实体表上运行查询,通过id获取实体(我假设为findOneById)。

我试图在存储库中创建自己的findOneById函数,但在这种情况下不会调用它。

如何设置doctrine / symfony以使这些查询结果可以缓存?

我正在运行Symfony 2.1.3和doctrine 2.3.x

2 个答案:

答案 0 :(得分:1)

我发现无法在函数中的doctrine构建中启用查询缓存。我会发布一个链接,解释为什么以后再找到它。

答案 1 :(得分: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

如果是这种情况,那么修改你的Character实体映射,以便它也急切地加载Race实体:

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

fetch选项上的学说文档:@ManyToOne