Метод find
Метод find класса EntityManager возвращает объект сущности, найденный по указанному идентификатору. Первым параметром передаётся имя класса сущности, вторым - значение первичного ключа. Если запись не найдена, метод возвращает null. Дополнительные параметры позволяют управлять блокировкой и гидратацией.
Синтаксис
public function find(string $className, mixed $id, int $lockMode = null, int $lockVersion = null): ?object
Пример
Давайте найдём сущность Article с идентификатором 1:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/find', name: 'article_find')]
public function find(EntityManagerInterface $em): Response
{
$article = $em->find(Article::class, 1);
if ($article === null) {
return new Response('article not found');
}
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода при наличии записи:
"hello"
Пример
Давайте обработаем ситуацию, когда сущность не найдена:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/find-null', name: 'article_find_null')]
public function findNull(EntityManagerInterface $em): Response
{
$article = $em->find(Article::class, 999);
if ($article === null) {
return new Response('article not found');
}
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода, если записи с таким id нет:
"article not found"
Пример
Давайте найдём сущность с блокировкой для последующего обновления:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use DoctrineDBALExceptionLockWaitTimeoutException;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/find-lock', name: 'article_find_lock')]
public function findLock(EntityManagerInterface $em): Response
{
try {
$article = $em->find(Article::class, 1, LockMode::PESSIMISTIC_WRITE);
if ($article === null) {
return new Response('article not found');
}
return new Response($article->getTitle());
} catch (LockWaitTimeoutException $e) {
return new Response('lock timeout');
}
}
}
?>
Результат выполнения кода при успешном захвате блокировки:
"hello"
Смотрите также
-
класс
EntityManager,
который управляет сущностями и их состоянием -
метод
getRepository,
который возвращает репозиторий для выборки записей -
метод
getReference,
который возвращает прокси-объект без запроса к базе -
метод
refresh,
который обновляет данные сущности из базы