Подефиниция не можете да изтриете записа, към който сочи външният ключ, без да зададете ключа на null (onDelete="SET NULL"
) или каскадна операция за изтриване (Има две опции
- Ниво на ORM:cascade={"remove"}
| ниво на база данни:onDelete="CASCADE"
).
Има алтернатива на задаване на стойност по подразбиране на все още съществуващ запис
, но трябва да направите това ръчно, не мисля, че Doctrine поддържа това „извън кутията“ (моля, поправете ме, ако греша, но в този случай настройката на стойност по подразбиране така или иначе не е желателна).
Тази строгост отразява концепцията за наличие на ограничения за външен ключ; както каза @Théo:
Мекото изтриване (вече споменато) е едно решение, но това, което бихте могли да направите, е да добавите допълнителен removed_page_id
колона, която синхронизирате с page_id
точно преди да го изтриете в preRemove
манипулатор на събития (обратно извикване на жизнения цикъл). Чудя се дали подобна информация има някаква стойност, но предполагам, че имаш някаква полза от нея, в противен случай не бихте задали този въпрос.
Определено не твърдя, че това е добра практика , но това е поне нещо, което можете да използвате за крайния си случай. Така че нещо в реда на:
Във вашата Revision
:
/**
* @ORM\ManyToOne(targetEntity="Page", cascade="persist")
* @ORM\JoinColumn(name="page_id", referencedColumnName="id", onDelete="SET NULL")
*/
private $parentPage;
/**
* @var int
* @ORM\Column(type="integer", name="removed_page_id", nullable=true)
*/
protected $removedPageId;
И след това във вашата Page
:
/**
* @ORM\PreRemove
*/
public function preRemovePageHandler(LifecycleEventArgs $args)
{
$entityManager = $args->getEntityManager();
$page = $args->getEntity();
$revisions = $page->getRevisions();
foreach($revisions as $revision){
$revision->setRemovedPageId($page->getId());
$entityManager->persist($revision);
}
$entityManager->flush();
}
Като алтернатива, разбира се, вече можете да зададете правилния $removedPageId
стойност по време на изграждането на вашата Revision
, тогава дори не е необходимо да изпълнявате обратно извикване на жизнения цикъл при премахване.