Параметр referencedColumnName атрибута JoinColumn
Параметр referencedColumnName используется внутри атрибута JoinColumn для указания имени столбца в связанной (целевой) сущности, на который ссылается внешний ключ. По умолчанию Doctrine использует первичный ключ целевой сущности, но если связь должна указывать на другой столбец (например, на уникальное поле), этот параметр становится обязательным.
Синтаксис
#[JoinColumn(name: 'column_name', referencedColumnName: 'target_column')]
Пример
Давайте создадим сущность User и сущность Article, где статья ссылается на пользователя не по id, а по уникальному полю username. Сначала создадим целевую сущность:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class User
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255, unique: true)]
private string $username;
public function getId(): ?int
{
return $this->id;
}
public function getUsername(): string
{
return $this->username;
}
public function setUsername(string $username): self
{
$this->username = $username;
return $this;
}
}
?>
Теперь создадим сущность Article, которая ссылается на username пользователя:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $title;
#[ORMManyToOne(targetEntity: User::class)]
#[ORMJoinColumn(name: 'user_username', referencedColumnName: 'username')]
private ?User $user = 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 getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
}
?>
В этом примере столбец user_username в таблице article будет ссылаться на столбец username в таблице user, а не на стандартный id.
Пример
Давайте проверим работу связи через код контроллера. Создадим пользователя и статью, а затем выведем имя пользователя, связанного со статьёй:
<?php
namespace AppController;
use AppEntityArticle;
use AppEntityUser;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(EntityManagerInterface $em): Response
{
$user = new User();
$user->setUsername('abcde');
$em->persist($user);
$article = new Article();
$article->setTitle('hello');
$article->setUser($user);
$em->persist($article);
$em->flush();
return new Response($article->getUser()->getUsername());
}
}
?>
Результат выполнения кода:
"abcde"
Смотрите также
-
атрибут
JoinColumn,
который задаёт столбец внешнего ключа -
параметр
name,
который задаёт имя столбца внешнего ключа -
параметр
nullable,
который разрешает NULL в столбце внешнего ключа -
связь
ManyToOne,
которая используется для связи многие-к-одному