Php 使用doctrine symfony仅清除一个实体/存储库的结果缓存

Php 使用doctrine symfony仅清除一个实体/存储库的结果缓存,php,symfony,caching,doctrine-orm,Php,Symfony,Caching,Doctrine Orm,我有消息实体存储库,我想为获取这些消息的查询缓存结果。但是fetchrepository函数将结果划分为多个页面,因此会涉及偏移量和限制 我唯一可以使这个存储库的结果缓存失效的方法是生成并记住另一个缓存项中的每个缓存id,然后使用该项使它们全部失效 是否有更好的解决方案来解决这个问题,这样我就可以仅对一个实体/存储库使结果缓存无效 编辑:我刚刚发现缓存id不用于唯一查询,但它会缓存所有查询,即使它们的变量发生变化 public function getMessages($offset, $lim

我有消息实体存储库,我想为获取这些消息的查询缓存结果。但是fetchrepository函数将结果划分为多个页面,因此会涉及偏移量和限制

我唯一可以使这个存储库的结果缓存失效的方法是生成并记住另一个缓存项中的每个缓存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所做的更改现在都可见


我只想说,这正是我所希望的工作方式。但我不确定这是否是某种未定义的行为?

我认为这对其他人来说可能是显而易见的,但我认为如果我使用id为“ResultCache ID1”的ResultCache,然后我将再次使用相同的缓存,第二次使用将覆盖第一次使用的缓存。但我发现它被分组在一个缓存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)
它将向“messages\u 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: '...'},
    }
}

要使其失效,我只需使“messages\u messages”缓存id失效。
所以我不需要为每个偏移量构建缓存id,比如message\u messages\u 0、message\u messages\u 1、message\u messages\u 2等等,然后在循环中使它们全部无效

您找到解决方案了吗?还是仍在寻找解决方案?为了提供缓存的唯一性,您应该在偏移量之后构造缓存的名称,因此,如果当前偏移量为
0
,则缓存名称将变为
messages\u messages\u 0
,依此类推。请尝试
->useResultCache(true,null,'messages\u messages\u.$offset)
。我希望我理解正确!?再看看这个:@Charles AntoineFournel我认为我确实找到了一个解决方案,但BentCoder说我应该为每个问题建立唯一的id,根据我在文章编辑中的检查和描述,id将所有查询分组。当我对多个偏移量使用单一ID时,它们仍然被缓存,我可以通过清除这一ID使所有页面无效。@BentCoder,根据我的检查,它似乎在不设置每个偏移量的唯一ID的情况下工作,在单一ID下它仍然缓存每个页面(我可以通过清除这一ID清除所有页面的缓存)@Mr_KoKa我在这里实际上有点困惑,所以让我们暂时忽略你面临的问题,专注于你想要的东西。简单地说,你能告诉我你到底需要什么吗?e、 g.“当我这样做时,这应该发生。”