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

Атрибут ManyToMany

Атрибут ManyToMany вешается на свойство сущности Doctrine и создаёт связь многие ко многим с другой сущностью. Первым параметром передаётся целевая сущность в виде targetEntity. Связь хранится в отдельной промежуточной таблице, имя которой задаётся атрибутом JoinTable. Для обратной стороны связи указывается параметр mappedBy, а для владеющей стороны - inversedBy.

Синтаксис

#[ManyToMany(targetEntity: Entity::class, inversedBy: 'field')]

Пример

Давайте создадим две сущности Article и Tag и свяжем их многие ко многим. Начнём с сущности Tag, которая будет обратной стороной связи:

<?php namespace AppEntity; use AppRepositoryTagRepository; use DoctrineORMMapping as ORM; #[ORMEntity(repositoryClass: TagRepository::class)] class Tag { #[ORMId] #[ORMGeneratedValue] #[ORMColumn] private ?int $id = null; #[ORMColumn(length: 255)] private ?string $name = null; #[ORMManyToMany(targetEntity: Article::class, mappedBy: 'tags')] private Collection $articles; public function getId(): ?int { return $this->id; } public function getName(): ?string { return $this->name; } public function setName(string $name): static { $this->name = $name; return $this; } public function getArticles(): Collection { return $this->articles; } } ?>

Теперь создадим сущность Article, которая будет владеющей стороной связи и зададим промежуточную таблицу через JoinTable:

<?php namespace AppEntity; use AppRepositoryArticleRepository; use DoctrineCommonCollectionsArrayCollection; use DoctrineCommonCollectionsCollection; use DoctrineORMMapping as ORM; #[ORMEntity(repositoryClass: ArticleRepository::class)] class Article { #[ORMId] #[ORMGeneratedValue] #[ORMColumn] private ?int $id = null; #[ORMColumn(length: 255)] private ?string $title = null; #[ORMManyToMany(targetEntity: Tag::class, inversedBy: 'articles')] #[ORMJoinTable(name: 'article_tag')] private Collection $tags; public function __construct() { $this->tags = new ArrayCollection(); } public function getId(): ?int { return $this->id; } public function getTitle(): ?string { return $this->title; } public function setTitle(string $title): static { $this->title = $title; return $this; } public function getTags(): Collection { return $this->tags; } public function addTag(Tag $tag): static { if (!$this->tags->contains($tag)) { $this->tags->add($tag); } return $this; } public function removeTag(Tag $tag): static { $this->tags->removeElement($tag); return $this; } } ?>

Пример

Давайте создадим статью, два тега и свяжем их через метод addTag:

<?php namespace AppController; use AppEntityArticle; use AppEntityTag; use DoctrineORMEntityManagerInterface; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentRoutingAttributeRoute; class ArticleController extends AbstractController { #[Route('/article', name: 'article_create')] public function create(EntityManagerInterface $em): Response { $article = new Article(); $article->setTitle('hello'); $tag1 = new Tag(); $tag1->setName('abcde'); $tag2 = new Tag(); $tag2->setName('user'); $article->addTag($tag1); $article->addTag($tag2); $em->persist($article); $em->persist($tag1); $em->persist($tag2); $em->flush(); return new Response('saved'); } } ?>

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

"saved"

Пример

Давайте выберем статью и получим все её теги через геттер getTags:

<?php namespace AppController; use AppEntityArticle; use AppRepositoryArticleRepository; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentRoutingAttributeRoute; class ArticleController extends AbstractController { #[Route('/article/{id}', name: 'article_show')] public function show(int $id, ArticleRepository $repo): Response { $article = $repo->find($id); $res = []; foreach ($article->getTags() as $tag) { $res[] = $tag->getName(); } return new Response(implode(', ', $res)); } } ?>

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

"abcde, user"

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

  • атрибут ManyToOne,
    который задаёт связь многие к одному
  • атрибут OneToMany,
    который задаёт связь один ко многим
  • атрибут JoinTable,
    который задаёт промежуточную таблицу связи
  • атрибут JoinColumn,
    который задаёт столбец внешнего ключа
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить