Метод detach
Метод detach класса EntityManager
открепляет переданную сущность от Doctrine.
После этого менеджер сущностей перестаёт
отслеживать изменения этой сущности: они
больше не попадут в базу данных при вызове
метода flush. При этом сама сущность
остаётся обычным PHP-объектом, и вы можете
продолжать работать с её свойствами.
Первым параметром передаётся сущность,
которую нужно открепить.
Синтаксис
$em->detach(object $entity)
Пример
Давайте открепим сущность статьи от менеджера
сущностей и проверим, отслеживается ли она
ещё с помощью метода contains:
<?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/detach', name: 'article_detach')]
public function detach(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('abcde');
$article->setText('article');
$em->persist($article);
$before = $em->contains($article);
$em->detach($article);
$after = $em->contains($article);
return new Response(var_export([$before, $after], true));
}
}
?>
Результат выполнения кода:
[true, false]
Пример
Давайте убедимся, что после открепления изменения сущности не сохраняются в базу данных. Сначала найдём статью, изменим её заголовок и открепим, а затем сравним заголовок в базе с новым значением:
<?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/detach-update', name: 'article_detach_update')]
public function detachUpdate(EntityManagerInterface $em): Response
{
$article = $em->find(Article::class, 1);
$article->setTitle('hello');
$em->detach($article);
$em->flush();
$em->clear();
$fresh = $em->find(Article::class, 1);
return new Response($fresh->getTitle());
}
}
?>
Результат выполнения кода:
"abcde"
Смотрите также
-
класс
EntityManager,
который управляет сущностями в Doctrine -
метод
persist,
который ставит сущность в очередь на сохранение -
метод
flush,
который синхронизирует изменения с базой данных -
метод
contains,
который проверяет, отслеживается ли сущность