Symfony Doctrine禁用缓存

时间:2016-05-06 19:50:31

标签: php symfony caching doctrine-orm doctrine

在我的symfony项目中,我有两个通过一对多相关的实体。 我需要找到第一个和最后一个孩子,所以我使用看起来像这样的存储库函数:

public function getFirstPost(Topic $topic)
{
    $query = $this->createQueryBuilder('t')
        ->addSelect('p')
        ->join('t.posts', 'p')
        ->where('t.id = :topic_id')
        ->setParameter('topic_id' => $topic->getId())
        ->orderBy('p.id', 'ASC')
        ->setMaxResults(1)
        ->getQuery();
    return $query->getOneOrNullResult();
}
public function getLastPost(Topic $topic)
{
    $query = $this->createQueryBuilder('t')
        ->addSelect('p')
        ->join('t.posts', 'p')
        ->where('t.id = :topic_id')
        ->setParameter('topic_id' => $topic->getId())
        ->orderBy('p.id', 'DESC')
        ->setMaxResults(1)
        ->getQuery();
    return $query->getOneOrNullResult();
}

所以唯一的区别在于->orderBy(),对于第一篇帖子我使用 ASC ,而最后一篇文章使用 DESC

现在如果我使用控制器中的其中一个函数,则返回预期的结果并正常工作。但是,如果我同时从我的控制器运行它们,它们会返回相同的结果,但它们不应该这样。

我的猜测是,Doctrine以某种方式缓存这些查询和结果,这就是为什么返回相同所以我尝试使用$query->useResultCache(false)但是没有做任何事情。

所以我的问题是,为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:2)

嗯,确实是缓存问题,但主要是查询问题。不是在这些函数中返回帖子,而是返回整个主题和连接的帖子。

您可以做的是重写这些查询以直接选择Post实体,并将Topic实体加入其中,并将其过滤。

如果您真的(不要这样做)需要这些查询才能工作,您可以分离其中一个方法返回的第一个主题,然后调用另一个方法:

$this->getDoctrine()->getManager()->detach($firstTopic);