Атрибут JoinColumn
Атрибут JoinColumn вешается на свойство сущности
вместе с атрибутом ManyToOne или OneToOne
и описывает столбец в таблице, который хранит внешний
ключ. Первым параметром передаётся имя столбца в базе
данных. Если атрибут не указан, Doctrine создаёт столбец
автоматически по имени свойства и имени первичного ключа
связанной сущности.
Синтаксис
#[JoinColumn(
name: 'column_name',
referencedColumnName: 'id',
nullable: true,
onDelete: 'CASCADE',
unique: false
)]
Пример
Давайте создадим сущность Article со связью
ManyToOne на сущность User и укажем
имя столбца внешнего ключа через атрибут JoinColumn:
<?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 = null;
#[ORMManyToOne(targetEntity: User::class)]
#[ORMJoinColumn(name: 'user_id', referencedColumnName: 'id')]
private ?User $user = null;
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 getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): static
{
$this->user = $user;
return $this;
}
}
?>
После выполнения команды миграции в таблице
article появится столбец user_id,
который ссылается на столбец id таблицы
user.
Пример
Давайте разрешим значение null во внешнем ключе
и зададим поведение CASCADE при удалении
связанной записи:
<?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 = null;
#[ORMManyToOne(targetEntity: User::class)]
#[ORMJoinColumn(
name: 'user_id',
referencedColumnName: 'id',
nullable: true,
onDelete: 'CASCADE'
)]
private ?User $user = null;
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 getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): static
{
$this->user = $user;
return $this;
}
}
?>
Теперь столбец user_id может хранить значение
NULL, а при удалении пользователя все связанные
с ним статьи также будут удалены.
Пример
Давайте сделаем связь OneToOne между
сущностями User и Profile
с уникальным внешним ключом:
<?php
namespace AppEntity;
use AppRepositoryProfileRepository;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: ProfileRepository::class)]
class Profile
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'text')]
private ?string $bio = null;
#[ORMOneToOne(targetEntity: User::class)]
#[ORMJoinColumn(
name: 'user_id',
referencedColumnName: 'id',
unique: true,
nullable: false
)]
private ?User $user = null;
public function getId(): ?int
{
return $this->id;
}
public function getBio(): ?string
{
return $this->bio;
}
public function setBio(string $bio): static
{
$this->bio = $bio;
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): static
{
$this->user = $user;
return $this;
}
}
?>
Благодаря параметру unique значение столбца
user_id будет уникальным, что гарантирует
связь «один к одному».
Смотрите также
-
атрибут
ManyToOne,
который задаёт связь «многие к одному» -
атрибут
OneToOne,
который задаёт связь «один к одному» -
параметр
name,
который задаёт имя столбца внешнего ключа -
параметр
referencedColumnName,
который задаёт имя столбца связанной сущности