Efter definition du kan ikke slette posten, som fremmednøglen peger på uden at sætte nøglen til null (onDelete="SET NULL"
) eller kaskade af slettehandlingen (Der er to muligheder
- ORM-niveau:cascade={"remove"}
| databaseniveau:onDelete="CASCADE"
).
Der er alternativet indstilling af en standardværdi for en stadig eksisterende post
, men du skal gøre det manuelt, jeg tror ikke, at Doctrine understøtter denne "out-of-the-box" (ret mig venligst, hvis jeg tager fejl, men i dette tilfælde er det alligevel ikke ønskeligt at indstille en standardværdi).
Denne strenghed afspejler konceptet med at have fremmednøglebegrænsninger; som @Théo sagde:
Blød sletning (allerede nævnt) er en løsning, men hvad du også kan gøre er at tilføje en ekstra removed_page_id
kolonne, som du synkroniserer med page_id
lige før du sletter det i en preRemove
hændelseshåndtering (livscyklustilbagekald). Jeg spekulerer på, om sådanne oplysninger har nogen værdi, men jeg gætter på, at du har brug for det, ellers ville du ikke stille dette spørgsmål.
Jeg påstår bestemt ikke, at dette er god praksis , men det er i hvert fald noget, du kan bruge til din kantkasse. Så noget i retning af:
I din 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;
Og derefter på din 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();
}
Alternativt kan du selvfølgelig allerede indstille den korrekte $removedPageId
værdi under opbygningen af din Revision
, så behøver du ikke engang at udføre et livscyklustilbagekald ved fjernelse.