我有一个消息实体仓库,我想为获取这些消息的查询结果缓存结果。但是,提取仓库函数将结果分页,因此涉及偏移量和限制。
我唯一想到的方法是生成并记住另一个缓存条目中的每个缓存ID,然后使用该条目使它们全部无效,从而仅使一个实体/仓库的结果缓存失效。有更好的解决此问题的方法吗?
编辑:我刚刚发现,缓存ID不用于唯一查询,而是缓存所有查询,即使它们的变量发生了变化。
我唯一想到的方法是生成并记住另一个缓存条目中的每个缓存ID,然后使用该条目使它们全部无效,从而仅使一个实体/仓库的结果缓存失效。有更好的解决此问题的方法吗?
编辑:我刚刚发现,缓存ID不用于唯一查询,而是缓存所有查询,即使它们的变量发生了变化。
public function getMessages($offset, $limit, $search = null){
$builder = $this->createQueryBuilder('m')
->orderBy('m.id', 'DESC')
->setFirstResult($offset)
->setMaxResults($limit);
if($search !== null){
$builder->where('m.title LIKE :searchQuery OR m.content LIKE :searchQuery')
->setParameter('searchQuery', '%'.$search.'%');
return $builder->getQuery()->getResult(Query::HYDRATE_ARRAY);
} else {
return $builder->getQuery()
->useResultCache(true, null, 'message_messages')
->getResult(Query::HYDRATE_ARRAY);
}
}
我有4个消息,设置每页显示2条消息。所以第一个查询的偏移量为0,限制为2,第二个查询的偏移量为2,也限制为2。
现在发生的情况是,两个查询都被缓存到单个缓存ID下。我从phpMyAdmin进行了更改,两个页面都没有变化,这意味着它们都使用了缓存。当我无效的“message_messages”缓存ID时,两个页面都发生了变化,phpMyAdmin所做的更改现在可见。
我只想说,这正是我希望它工作的方式。但我不确定它是否属于某种未定义行为?
0
,则您的缓存名称变为message_messages_0
等。尝试使用->useResultCache(true, null, 'message_messages_'.$offset)
。我希望我理解得正确!?还请查看:http://www.inanzzz.com/index.php/post/ck9l/using-doctrine-apc-caching-with-query-builder-in-symfony - BentCoder