Получение актуальных данных в 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 вернуться актуальные данные.