如何进行查询和结果缓存用于查询Symfony2和Doctrine2中的关联实体?

时间:2015-10-07 05:36:51

标签: php symfony caching doctrine-orm

我正在使用memcahe用于Symfony Doctrine缓存驱动程序,如下所示:

doctrine:
    orm:
        metadata_cache_driver: memcache
        result_cache_driver: memcache
        query_cache_driver: memcache

我有ArticleTagmanyToMany关系的实体。我有一个控制器,可以获取所有文章(带分页)并将它们渲染成树枝。以下代码位于Article存储库中,该存储库使用useQueryCache()useResultCache()

$articles = $this->createQueryBuilder('a')
    ->orderBy('a.created_at', 'DESC')
    ->getQuery()
    ->useQueryCache(true)
    ->useResultCache(true)
    ->getResult();

DQL完全缓存查询和结果,因为我没有在Symfony Profiler Doctrine部分看到执行的查询。问题是关联实体Tag未被缓存的结果。我在树枝上有以下代码:

{% for article in articles %}
    // ...
    {% if article.tags|length %}
        <div class="tag-wrapper clearfix">
            {% for tag in article.tags %}
                // ...
            {% endfor %}
        </div>
    {% endif %}
    // ...
{% endfor %}

调用article.tags似乎始终在没有缓存的情况下获取相关文章的标签。我看到所有查询都在Symfony Profiler Doctrine部分的每个页面加载上执行。是否可以缓存此内容?

1 个答案:

答案 0 :(得分:2)

你遗漏了几件事:

  1. 您未加入tags关系,而且您未在查询中选择
  2. 您需要启用急切提取才能使其正常工作
  3. 在这里查看一些指示:Doctrine2 (Doctrine 2.1) eager loading in Symfony2

    另一方面,如果您预期很多文章在该页面上有很多标签,我会小心这样做。即使使用缓存,您也可能会遇到时间和/或内存问题。