РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
10 of 258 menu

Метод 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,
    который синхронизирует изменения с базой данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить