Получение актуальных данных в Doctrine после обновления сущности через SQL запрос хранимой процедуры
Выполнял тут следующую задачу на проекте на Symfony. Нужно было реализовать хранимую процедуру в PostgreSQL, затем вызывать её и вернуть обновлённую сущность.
Выполнение хранимой процедуры выглядит так:
$conn = $this->em->getConnection(); $conn->beginTransaction(); try { $sql = "CALL fn_custom_storage_procedure(:arg1, :arg2, :arg3)"; $stmt = $conn->prepare($sql); $stmt->execute([ ':arg1' => $entity->getArg1(), ':arg2' => $entity->getArg2(), ':arg3' => $entity->getArg3() ]); $conn->commit(); } catch (ConnectionException $e) { $conn->rollBack(); }
Далее нужно вернуть обновлённую сущность.
$entity = $this->em->getRepository(Entity::class)->findOneBy(['id' => 1]);
если просто вызвать таким образом, то в переменной $entity
будут храниться ещё старые значения, хотя в базе уже будут храниться новые.
В этом случаем нужно воспользоваться методом refresh
менеджера сущностей:
$entity = $this->em->getRepository(Entity::class)->findOneBy(['id' => 1]); $this->em->refresh($entity);
после этого в $entity вернуться актуальные данные.