Intereting Posts
MongoDB: запрос нескольких коллекций с двумя запросами? fetchAll вспомогательная функция с использованием PDO Как получить URL-адрес настраиваемого элемента в Magento? как получить выход из процесса opend по popen в php? Показывать данные на основе выбранного идентификатора в модальном всплывающем окне после нажатия кнопки php mysql php: SQLSTATE Соединение не может быть выполнено, потому что целевая машина активно отказалась от него Как передать динамически созданный список контроллеру для сохранения в базе данных? Ошибка при обновлении таблицы MySQL PayPal IPN на порту, отличном от 80 Я нарушаю любую «хорошую практику php» в следующем массиве php, который имеет дело с 3 (человеческими) языками? Приложения для Symfony2 YML по каждому запросу не загружать фотографию и не показывать ошибок в кодериктории3 Вызов fcsh из скрипта PHP Найти все слова с strpos () Как ассоциации определяются, когда код испечен в CakePHP

Как остановить Doctrine 2 от кеширования результата в Symfony 2?

Я хочу иметь возможность получить существующую версию объекта, чтобы сравнить его с последней версией. Например, редактирование файла, я хочу знать, изменилось ли значение с момента его нахождения в БД.

$entityManager = $this->get('doctrine')->getEntityManager(); $postManager = $this->get('synth_knowledge_share.manager'); $repository = $entityManager->getRepository('KnowledgeShareBundle:Post'); $post = $repository->findOneById(1); var_dump($post->getTitle()); // This would output "My Title" $post->setTitle("Unpersisted new title"); $existingPost = $repository->findOneById(1); // Retrieve the old entity var_dump($existingPost->getTitle()); // This would output "Unpersisted new title" instead of the expected "My Title" 

Кто-нибудь знает, как я могу обойти это кэширование?

Related of "Как остановить Doctrine 2 от кеширования результата в Symfony 2?"

Это нормальное поведение.

Doctrine хранит ссылку на полученные объекты в EntityManager, чтобы она могла вернуть объект по своему id без выполнения другого запроса.

Вы можете сделать что-то вроде:

 $entityManager = $this->get('doctrine')->getEntityManager(); $repository = $entityManager->getRepository('KnowledgeShareBundle:Post'); $post = $repository->find(1); $entityManager->detach($post); // as the previously loaded post was detached, it loads a new one $existingPost = $repository->find(1); 

Но имейте это в виду, поскольку объект $ post был отсоединен, вы должны использовать метод -> merge (), если хотите снова его сохранить.

Вы также можете использовать метод refresh , который обновляет постоянное состояние объекта из базы данных, переопределяя любые локальные изменения, которые еще не были сохранены. Что-то вроде:

 $entityManager = $this->get('doctrine')->getEntityManager(); $repository = $entityManager->getRepository('KnowledgeShareBundle:Post'); $post = $repository->find(1); $entityManager->refresh($post); 

теперь $ post содержит последнюю версию из базы данных.