Параметр targetEntity
Параметр targetEntity атрибута ManyToOne
задаёт класс сущности, на которую ссылается
текущая сущность. Атрибут ManyToOne вешается
на свойство класса сущности и создаёт связь
«многие к одному». Параметр targetEntity
принимает строку с полным именем класса
целевой сущности. Если параметр не указан,
Doctrine пытается определить целевую сущность
по типу свойства.
Синтаксис
#[ManyToOne(targetEntity: Entity::class)]
Пример
Давайте создадим сущность Category
и сущность Article, которая ссылается
на категорию через targetEntity:
<?php
namespace AppEntity;
use AppRepositoryCategoryRepository;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: CategoryRepository::class)]
class Category
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $name;
public function getId(): ?int
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
}
?>
<?php
namespace AppEntity;
use AppRepositoryArticleRepository;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: ArticleRepository::class)]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $title;
#[ORMManyToOne(targetEntity: Category::class)]
#[ORMJoinColumn(nullable: false)]
private ?Category $category = null;
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getCategory(): ?Category
{
return $this->category;
}
public function setCategory(?Category $category): self
{
$this->category = $category;
return $this;
}
}
?>
Теперь при создании статьи мы можем указать категорию, и Doctrine сохранит внешний ключ в таблице статей:
<?php
namespace AppController;
use AppEntityArticle;
use AppEntityCategory;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/create', name: 'article_create')]
public function create(EntityManagerInterface $em): Response
{
$category = new Category();
$category->setName('abcde');
$article = new Article();
$article->setTitle('hello');
$article->setCategory($category);
$em->persist($category);
$em->persist($article);
$em->flush();
return new Response('article saved');
}
}
?>
Результат выполнения кода:
"article saved"
Пример
Давайте получим статью вместе с её категорией через репозиторий:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/show/{id}', name: 'article_show')]
public function show(int $id, EntityManagerInterface $em): Response
{
$article = $em->getRepository(Article::class)->find($id);
return new Response($article->getCategory()->getName());
}
}
?>
Результат выполнения кода:
"abcde"
Смотрите также
-
атрибут
ManyToOne,
который создаёт связь «многие к одному» -
параметр
inversedBy,
который задаёт обратное свойство связи -
параметр
cascade,
который задаёт каскадные операции -
параметр
fetch,
который задаёт стратегию загрузки связи