在我的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)
但是没有做任何事情。
所以我的问题是,为什么会发生这种情况,我该如何解决?
答案 0 :(得分:2)
嗯,确实是缓存问题,但主要是查询问题。不是在这些函数中返回帖子,而是返回整个主题和连接的帖子。
您可以做的是重写这些查询以直接选择Post
实体,并将Topic
实体加入其中,并将其过滤。
如果您真的(不要这样做)需要这些查询才能工作,您可以分离其中一个方法返回的第一个主题,然后调用另一个方法:
$this->getDoctrine()->getManager()->detach($firstTopic);