我有消息实体存储库,我想缓存获取这些消息的查询的结果。但是fetch存储库功能将结果划分为页面,因此存在偏移和限制。
我唯一的想法是如何使这个存储库的结果缓存无效,就是生成并记住另一个缓存条目中的每个缓存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 :(得分:0)
我这对其他人来说可能是显而易见的,但我认为如果我使用带有id的结果缓存,例如。 “resultCacheId1”然后我将再次使用相同的缓存,第二次使用将覆盖第一个缓存。但我发现它被归为一个缓存ID,如下所示:
与我的问题相同的功能,我将摆脱 $ search 和 $ limit 参数来简化它:
public function getMessages($offset){
$builder = $this->createQueryBuilder('m')
->orderBy('m.id', 'DESC')
->setFirstResult($offset)
->setMaxResults($limit)
->getQuery()
->useResultCache(true, null, 'message_messages')
->getResult(Query::HYDRATE_ARRAY);
}
出于测试目的,要获取并查看我使用的缓存中的内容:
$em->getConfiguration()->getResultCacheImpl()->fetch('message_messages')
如果我像getMessages(0)
一样使用函数,它将在缓存中显示为:
array:1 {
"SELECT ... FROM message m0_ ORDER BY m0_.id DESC LIMIT 2 OFFSET 0-a:0:{}-a:0:{}" => array:2 {
0 => array:4 {id: 6, title: '...', content: '...', date: '...'},
1 => array:4 {id: 5, title: '...', content: '...', date: '...'},
}
}
当我像getMessages(1)
一样再次使用它时,它会在'message_messages'缓存ID中添加另一个条目:
array:1 {
"SELECT ... FROM message m0_ ORDER BY m0_.id DESC LIMIT 2 OFFSET 0-a:0:{}-a:0:{}" => array:2 {
0 => array:4 {id: 6, title: '...', content: '...', date: '...'},
1 => array:4 {id: 5, title: '...', content: '...', date: '...'},
},
"SELECT ... FROM message m0_ ORDER BY m0_.id DESC LIMIT 2 OFFSET 2-a:0:{}-a:0:{}" => array:2 {
0 => array:4 {id: 4, title: '...', content: '...', date: '...'},
1 => array:4 {id: 3, title: '...', content: '...', date: '...'},
}
}
为了使它无效,我只能使'message_messages'的缓存ID无效。 因此,我不需要为每个唯一的偏移量构建缓存ID,如message_messages_0,message_messages_1,message_messages_2等等,然后在循环中使它们全部无效。