Атрибут InverseJoinColumn
Атрибут InverseJoinColumn используется внутри атрибута JoinTable
для связи ManyToMany. Он описывает колонку в промежуточной таблице,
которая ссылается на обратную (inverse) сущность связи.
Первым параметром передаётся имя колонки в промежуточной таблице,
вторым - имя колонки, на которую ссылается внешний ключ.
Синтаксис
#[InverseJoinColumn(name, referencedColumnName, nullable, onDelete, unique)]
Пример
Давайте свяжем сущности Article и Tag отношением ManyToMany
и укажем колонку обратной стороны через InverseJoinColumn:
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $title = null;
#[ORM\ManyToMany(targetEntity: Tag::class)]
#[ORM\JoinTable(name: 'article_tag')]
#[ORM\JoinColumn(name: 'article_id', referencedColumnName: 'id')]
#[ORM\InverseJoinColumn(name: 'tag_id', referencedColumnName: 'id')]
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;
}
}
?>
В промежуточной таблице article_tag появятся две колонки:
article_id (задаётся через JoinColumn) и
tag_id (задаётся через InverseJoinColumn).
Пример
Давайте добавим тег к статье и выведем его название:
<?php
namespace App\Controller;
use App\Entity\Article;
use App\Entity\Tag;
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
{
$article = new Article();
$article->setTitle('hello');
$tag = new Tag();
$tag->setName('abcde');
$article->getTags()->add($tag);
$em->persist($article);
$em->persist($tag);
$em->flush();
return new Response($article->getTags()->first()->getName());
}
}
?>
Результат выполнения кода:
"abcde"
Смотрите также
-
атрибут
ManyToMany,
который задаёт связь многие-ко-многим -
атрибут
JoinTable,
который задаёт промежуточную таблицу связи -
атрибут
JoinColumn,
который задаёт колонку владеющей стороны связи -
параметр
name,
который задаёт имя колонки в таблице