Я хочу иметь возможность получить существующую версию объекта, чтобы сравнить его с последней версией. Например, редактирование файла, я хочу знать, изменилось ли значение с момента его нахождения в БД.
$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"
Кто-нибудь знает, как я могу обойти это кэширование?
Это нормальное поведение.
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 содержит последнюю версию из базы данных.