【问题标题】:Doctrine and Symfony: magic methods and cachingDoctrine 和 Symfony:魔术方法和缓存
【发布时间】:2012-11-07 17:49:51
【问题描述】:

我目前正在实现学说结果缓存,所以我已经设置了

result_cache_driver: apc

进入我的配置。

然后我已经正确地让查询缓存在存储库中工作,例如使用

->setResultCacheId(sprintf('posts_for_user_%d', $userId))

当我在教义中使用这些东西时,第一个问题来了:

$repository->findOneBy(array)
$repository->findBy(array)

这可能很容易在存储库中被覆盖。

我无法解决的问题是使用 ParamConverter 来使用学说缓存以及实体关联。

例如,如果我有一个与 Player 具有 OneToMany 关系的 Team 实体,我通常会这样做

$team->getPlayers()

我无法控制该查询的缓存。以某种方式可能吗?

【问题讨论】:

    标签: symfony doctrine doctrine-orm symfony-2.1


    【解决方案1】:

    当您运行诸如 find/findBy 之类的方法或通过 $team->getPlayers() 处理 PersistentCollection 时,UoW 使用 EntityPersister 和 ObjectHydrator 加载数据以水合对象。这些对象不支持结果缓存驱动程序。

    另一方面,当您使用 DQL 或 QueryBuilder 时,您的代码会生成扩展 AbstractQuery 的 Query 对象。如果您查看 AbstractQuery::execute 内部,您会看到这段漂亮的代码,它使得使用结果缓存驱动程序成为可能

    $cache             = $queryCacheProfile->getResultCacheDriver();
    $result            = $cache->fetch($cacheKey);
    
    if (isset($result[$realCacheKey])) {
        return $result[$realCacheKey];
    }
    

    所以我的建议 - 尝试使用 QueryBuilder 加载您的实体,并在子集合上使用 leftJoins。

    $this->createQueryBuilder('x')->select('x, p')->leftJoin('x.players', 'p')->....;
    

    它将创造使用结果缓存驱动程序的可能性。

    【讨论】:

    • 你能解释一下UoW是什么意思吗?那么正确使用缓存及其所有功能的唯一方法是我应该在存储库函数中实现缓存?
    • UoW = UnitOfWork 类。您应该使用结果缓存驱动程序 + 查询对象(使用 QueryBuilder 或手动方式生成)
    • 我再等几天,如果没有新的回复,我会接受你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2018-08-21
    • 2015-07-23
    相关资源
    最近更新 更多