Метод refresh
Метод refresh класса EntityManager предназначен для принудительного обновления состояния сущности в Unit of Work из базы данных. Он принимает первым параметром объект сущности, который необходимо обновить. Метод выполняет SQL-запрос к базе данных и перезаписывает значения полей переданного объекта актуальными данными из БД. Это полезно, когда данные в базе были изменены другим процессом или когда требуется откатить изменения, сделанные в объекте без вызова flush.
Синтаксис
public function refresh(object $entity): void
Пример
Давайте создадим сущность, сохраним её, а затем изменим поле в объекте и вызовем refresh, чтобы вернуть исходное значение из базы данных:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/refresh', name: 'article_refresh')]
public function refresh(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('article');
$article->setText('hello');
$em->persist($article);
$em->flush();
$article->setTitle('changed title');
$em->refresh($article);
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода:
"article"
Пример
Давайте рассмотрим ситуацию, когда данные в базе были изменены извне, и нам нужно получить актуальное значение:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/sync', name: 'article_sync')]
public function sync(EntityManagerInterface $em): Response
{
$article = $em->getRepository(Article::class)->find(1);
// external process updates the title in the database
$em->refresh($article);
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода (после внешнего обновления):
"updated from db"
Смотрите также
-
класс
EntityManager,
который управляет жизненным циклом сущностей -
метод
flush,
который синхронизирует изменения с базой данных -
метод
find,
который находит сущность по идентификатору -
метод
clear,
который очищает Unit of Work от всех сущностей