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

Метод commit класса EntityManager

Метод commit класса EntityManager завершает текущую активную транзакцию и навсегда сохраняет все изменения, выполненные внутри неё, в базе данных. Обычно применяется в паре с методом beginTransaction, который открывает транзакцию. Если транзакция не была открыта, метод выбрасывает исключение LogicException.

Метод не принимает параметров и не возвращает значения. После вызова commit изменения становятся видимыми для других подключений и не могут быть отменены через rollback.

Синтаксис

$em->commit();

Пример

Давайте откроем транзакцию, сохраним новую сущность и зафиксируем изменения через commit:

<?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', name: 'article_create')] public function create(EntityManagerInterface $em): Response { $em->beginTransaction(); $article = new Article(); $article->setTitle('abcde'); $article->setContent('hello'); $em->persist($article); $em->flush(); $em->commit(); return new Response((string) $article->getId()); } } ?>

Результат выполнения кода:

1

Пример

Давайте обновим существующую сущность внутри транзакции и подтвердим изменения:

<?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/update/{id}', name: 'article_update')] public function update(int $id, EntityManagerInterface $em): Response { $em->beginTransaction(); $article = $em->find(Article::class, $id); $article->setTitle('user'); $em->flush(); $em->commit(); return new Response($article->getTitle()); } } ?>

Результат выполнения кода:

"user"

Пример

Давайте откатим транзакцию, если при сохранении произошла ошибка, и зафиксируем её только при успешном выполнении:

<?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/save', name: 'article_save')] public function save(EntityManagerInterface $em): Response { $em->beginTransaction(); try { $article = new Article(); $article->setTitle('article'); $article->setContent('abcde'); $em->persist($article); $em->flush(); $em->commit(); return new Response('committed'); } catch (\Throwable $e) { $em->rollback(); return new Response('rolled back'); } } } ?>

Результат выполнения кода при успешном сохранении:

"committed"

Смотрите также

  • класс EntityManager,
    который управляет сущностями и транзакциями
  • метод beginTransaction,
    который открывает новую транзакцию
  • метод rollback,
    который отменяет текущую транзакцию
  • метод flush,
    который синхронизирует изменения с базой данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить