Как да настроя резултатите от кеша на заявките за вградените функции на хранилището на doctrine2?

Имам сайт, който е за видео игра, която играя, и работя върху подобряването на производителността на сайта чрез прилагане на допълнително кеширане. Вече успях да внедря кеширане на резултати от заявки в персонализирани функции на хранилище, но не можах да намеря никъде, което обяснява как мога да включа кеширане на резултати от заявки във вградените функции (findOneById и т.н.). Интересувам се да направя това, защото много от моите заявки към базата данни се изпълняват от тези „родни“ функции на хранилището.

Така че като пример имам обект на характерен обект със следните свойства: id, име, раса, клас и т.н.

Раса и клас в този обект са препратки към други обекти на обекти за раса и класа. Когато зареждам символ за показване, получавам героя по име (findOneByName) и след това в моя шаблон показвам расата/класата на героя по $characterObject->getRace()->getName(). Тези извиквания на метод в шаблона водят до изпълнение на заявка на моите таблици на обекти Race/Class, извличащи обекта по id (findOneById предполагам).

Опитах се да създам своя собствена функция findOneById в хранилището, но тя не се извиква при тези обстоятелства.

Как мога да настроя doctrine/symfony така, че тези резултати от заявката да могат да се кешират?

Работя със Symfony 2.1.3 и doctrine 2.3.x


person Chris    schedule 10.10.2012    source източник


Отговори (2)


Разбрах, че не е възможно да активирам кеша на заявките във функциите за вграждане на доктрина. Ще публикувам връзка, която обяснява защо по-късно, след като го намеря отново.

person Chris    schedule 09.12.2012

Вашите обекти вероятно изглеждат по следния начин:

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

Ако случаят е такъв, тогава променете съпоставянето на обекта на персонажа, така че да зарежда с нетърпение и обекта Race:

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

Документация на доктрината за опцията fetch: @ManyToOne

person Thomas Kelley    schedule 11.10.2012
comment
Eager fetch не ми помага с кеширането. С активиран eager той не променя броя на изпълнените заявки или кешира резултатите. Част от проблема ми тук е, че има 6 или повече раси, които се променят веднъж на година или така, бих искал да кеширам информацията за расата, така че да може да се използва повторно за всеки герой, независимо от контекста (профил на персонаж, списък с членове на гилдията и т.н. ). Опитвам се да избягвам да пиша DQL, специфичен за нуждите от данни на всяка страница... което съм сигурен, че е най-ефективното решение, но се опитвам да отида за простота. - person Chris; 11.10.2012