Параметр onDelete атрибута JoinColumn
Параметр onDelete атрибута JoinColumn задаёт
SQL-правило ON DELETE для внешнего ключа в базе данных.
Он определяет, что произойдёт со связанными записями,
когда главная сущность будет удалена. Значением параметра
выступает строка с одним из стандартных правил: 'CASCADE',
'SET NULL', 'RESTRICT', 'NO ACTION' или
'SET DEFAULT'. Атрибут JoinColumn вешается на
свойство сущности, которое ссылается на другую сущность.
Синтаксис
#[JoinColumn(onDelete: 'CASCADE')]
Пример
Давайте создадим сущность Article, связанную с
сущностью User через ManyToOne. При удалении
пользователя все его статьи должны удаляться автоматически.
Для этого укажем 'CASCADE':
<?php
namespace AppEntity;
use AppRepositoryArticleRepository;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: ArticleRepository::class)]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn]
private ?int $id = null;
#[ORMColumn(length: 255)]
private ?string $title = null;
#[ORMManyToOne(targetEntity: User::class)]
#[ORMJoinColumn(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 для полноты примера:
<?php
namespace AppEntity;
use AppRepositoryUserRepository;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: UserRepository::class)]
class User
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn]
private ?int $id = null;
#[ORMColumn(length: 255)]
private ?string $name = null;
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;
}
}
?>
После применения миграции в базе данных для колонки
user_id таблицы article будет создан внешний
ключ с правилом ON DELETE CASCADE. Это значит, что
при удалении пользователя все связанные с ним статьи будут
удалены на уровне СУБД.
Пример
Если при удалении пользователя нужно не удалять статьи,
а лишь обнулить ссылку на него, используем 'SET NULL'.
При этом колонка должна допускать значение NULL:
<?php
namespace AppEntity;
use AppRepositoryArticleRepository;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: ArticleRepository::class)]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn]
private ?int $id = null;
#[ORMColumn(length: 255)]
private ?string $title = null;
#[ORMManyToOne(targetEntity: User::class)]
#[ORMJoinColumn(onDelete: 'SET NULL', nullable: true)]
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, а сами статьи останутся в базе.
Доступные значения
Параметр onDelete принимает следующие значения:
-
'CASCADE'- связанные записи удаляются вместе с главной -
'SET NULL'- внешний ключ обнуляется (требуетnullable: true) -
'RESTRICT'- удаление главной записи запрещается, если есть связанные -
'NO ACTION'- поведение по умолчанию, аналогично'RESTRICT'в большинстве СУБД -
'SET DEFAULT'- внешний ключ устанавливается в значение по умолчанию
Смотрите также
-
атрибут
JoinColumn,
который описывает колонку внешнего ключа -
параметр
nullable,
который разрешает значение NULL во внешнем ключе -
параметр
referencedColumnName,
который задаёт имя колонки главной сущности -
связь
ManyToOne,
которая чаще всего используется с JoinColumn