使用doctrine symfony

时间:2017-02-21 14:55:07

标签: php symfony caching doctrine-orm

我有消息实体存储库,我想缓存获取这些消息的查询的结果。但是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所做的更改现在可见。

我只是想说这是我的工作方式。但是我不确定它是不是某种未定义的行为?

1 个答案:

答案 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等等,然后在循环中使它们全部无效。