2016-05-06 3 views
0

В моем проекте symfony у меня есть два объекта, которые связаны между собой от одного до многих. мне нужно найти первый и последний ребенок, поэтому я использую функцию хранилища, которые выглядят следующим образом:Symfony Doctrine отключить кеш

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.

Теперь, если я использую одну из этих функций от своего контроллера, возвращаю ожидаемый результат и работаю нормально. Но если я запускаю их обоих одновременно с моим контроллером, они возвращают тот же результат, которого они не должны.

Я полагаю, что доктрина тайно кэширует эти запросы и результаты, и поэтому возвращение одинаково, поэтому я попытался использовать $query->useResultCache(false), но ничего не сделал.

Итак, мой вопрос: почему это происходит и как я могу это исправить?

+0

Вы уверены, что есть не только один пост в прошедшей теме? –

+0

Да, тема, на которую я тестирую, имеет первого ребенка Id 17 и последний ребенок Id 23 и содержит всего 4 детей в целом – Kable

ответ

2

Ну, это проблема с кешем, но в основном это проблема с запросом. Вместо того, чтобы возвращать сообщение в этой функции, вы возвращаете целую тему со связанными сообщениями.

Что вы можете сделать, так это переписать эти запросы, чтобы напрямую выбрать объект Post и присоединиться к объекту Topic, который будет отфильтрован.

Если вы действительно (не делают этого) нужны эти запросы на работу вы можете отделить первую тему, возвращенное одним из этих способов, а затем вызвать другой метод:

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

Запрос на 'post' и объединение' Topic' сделал трюк. Спасибо! – Kable