Метод clear класса EntityManager
Метод clear класса EntityManager полностью очищает
внутреннее хранилище сущностей Doctrine, называемое UnitOfWork.
Все загруженные и управляемые сущности открепляются от менеджера,
а их изменения, ещё не записанные в базу данных, теряются.
Метод не принимает обязательных параметров и ничего не возвращает.
После вызова метода clear менеджер сущностей возвращается
в исходное состояние, как будто ни одна сущность ещё не была
загружена. Это полезно при обработке больших объёмов данных,
когда нужно освободить память от накопленных объектов.
Синтаксис
$em->clear();
Пример
Давайте загрузим сущность, а затем вызовем метод clear
и проверим, что менеджер больше не управляет ею:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$article = $em->getRepository(Article::class)->find(1);
$before = $em->contains($article);
$em->clear();
$after = $em->contains($article);
return new Response(var_export([$before, $after], true));
}
}
?>
Результат выполнения кода:
[true, false]
Пример
Давайте разберём пример с массовым изменением сущностей,
где метод clear помогает экономить память:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$articles = $em->getRepository(Article::class)->findAll();
foreach ($articles as $article) {
$article->setTitle('updated');
$em->persist($article);
}
$em->flush();
$em->clear();
return new Response('done');
}
}
?>
Результат выполнения кода:
"done"
После вызова clear все объекты становятся отсоединёнными,
а память, занятая ими, может быть освобождена сборщиком мусора.
Пример
Давайте посмотрим, что произойдёт, если обратиться к сущности
после вызова метода clear без повторной загрузки:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$article = $em->getRepository(Article::class)->find(1);
$id = $article->getId();
$em->clear();
$reloaded = $em->getRepository(Article::class)->find($id);
return new Response($reloaded->getTitle());
}
}
?>
Результат выполнения кода:
"article"
Смотрите также
-
класс
EntityManager,
который управляет сущностями Doctrine -
метод
detach,
который открепляет одну конкретную сущность -
метод
refresh,
который обновляет состояние сущности из базы данных -
метод
flush,
который синхронизирует изменения с базой данных