我正在使用Gedmo Doctrine extensions
到目前为止,所有工作都很顺利,除了翻译缓存。
$entity = $repository
->findByIdFullData($id)
->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker')
->useResultCache(true, $cache_time, $cache_name)
->getOneOrNullResult();
findByIdFullData()
返回\Doctrine\ORM\Query
但翻译没有缓存。在分析器中,我看到类似的查询:
SELECT
e0_.content AS content0,
e0_.field AS field1
FROM
ext_translations e0_
WHERE
e0_.foreign_key = ?
AND e0_.locale = ?
AND e0_.object_class = ?
分析器中的所有查询都是从ext_translations
获取结果。如何使用翻译的字符串缓存结果?
尝试使用Array Hydration和memCache,但结束了更多,因为我的结果项已经上传了无法序列化的媒体文件或其他东西。无论如何,我最终会重写大部分代码。
感谢任何帮助。
修改:
我已经尝试了Karol Wojciechowski的答案,它解决了部分问题。当我使用getOneOrNullResult()
但不使用getResult()
时,它会缓存。这是一些代码。
在服务中:
$query = $this->em
->getRepository('MainBundle:Channels')
->findActiveChannelsByGroupId($id);
$this->container->get('my.translations')->addTranslationWalkerToQuery($query, $this->request);
$channels = $query
->useResultCache(true, 900, '1__channels__active_by_group_1')
->getResult();
频道库:
public function findActiveChannelsByGroupId($group_id, $limit = null)
{
$rs = $this
->createQueryBuilder('c')
->select('c', 'm')
->leftJoin('c.media', 'm')
->leftJoin('c.group', 'g')
->where('c.active = 1')
->andWhere('g.id = :group_id')
->orderBy('c.sortOrder', 'asc')
->setParameter('group_id', $group_id)
->setMaxResults($limit);
return $rs->getQuery();
}
如果我更改为findActiveChannelsByGroupId($id, 1)
(通知限制参数),它仍然不会缓存,但如果我更改为getOneOrNullResult()
,则查询会被缓存
答案 0 :(得分:3)
我们的工作代码:
public function addTranslationWalkerToQuery($query, $request)
{
$config = $this->container->get('doctrine')->getManager()->getConfiguration();
if ($config->getCustomHydrationMode(TranslationWalker::HYDRATE_OBJECT_TRANSLATION) === null) {
$config->addCustomHydrationMode(
TranslationWalker::HYDRATE_OBJECT_TRANSLATION,
'Gedmo\\Translatable\\Hydrator\\ORM\\ObjectHydrator'
);
}
$query->setHint(
\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
);
$query->setHint(
\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE,
$request->getLocale() // take locale from session or request etc.
);
$query->setHydrationMode(TranslationWalker::HYDRATE_OBJECT_TRANSLATION);
$query->setHint(Query::HINT_REFRESH, true);
}
修改强> 如果你想" getResult"
执行getResult更改水合模式。看看AbstractQuery类方法:
/**
* Gets the list of results for the query.
*
* Alias for execute(null, $hydrationMode = HYDRATE_OBJECT).
*
* @param int $hydrationMode
*
* @return array
*/
public function getResult($hydrationMode = self::HYDRATE_OBJECT)
{
return $this->execute(null, $hydrationMode);
}
它与getOneOrNullResult
一起使用,因为它没有改变水合模式
public function getOneOrNullResult($hydrationMode = null)
如果要缓存可翻译查询,则应在执行getResult方法期间将水合模式更改为TranslationWalker::HYDRATE_OBJECT_TRANSLATION
。
就个人而言,我将这种方法包装成服务,处理与翻译相关的所有事情。