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

Параметр 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
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить