Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Doctrine Foreign Key Constraint deaktivieren

Per Definition Sie können den Datensatz, auf den der Fremdschlüssel zeigt, nicht löschen, ohne den Schlüssel auf null zu setzen (onDelete="SET NULL"). ) oder Kaskadieren des Löschvorgangs (Es gibt zwei Optionen ). - ORM-Ebene:cascade={"remove"} | Datenbankebene:onDelete="CASCADE" ).
Es gibt die Alternative von Festlegen eines Standardwerts für einen noch vorhandenen Datensatz , aber Sie müssen das manuell tun, ich glaube nicht, dass Doctrine dies "out-of-the-box" unterstützt (bitte korrigieren Sie mich, wenn ich falsch liege, aber in diesem Fall ist das Setzen eines Standardwerts sowieso nicht erwünscht).

Diese Strenge spiegelt das Konzept der Fremdschlüsseleinschränkungen wider; wie @Théo sagte:

Vorläufiges Löschen (bereits erwähnt) ist eine Lösung, aber Sie könnten auch eine zusätzliche removed_page_id hinzufügen Spalte, die Sie mit der page_id synchronisieren kurz bevor Sie es in einem preRemove löschen Event-Handler (Lebenszyklus-Callback). Ob solche Informationen irgendeinen Wert haben, frage ich mich, aber ich schätze, Sie haben eine Verwendung dafür, sonst würden Sie diese Frage nicht stellen.

Ich behaupte definitiv nicht, dass dies eine gute Praxis ist , aber es ist zumindest etwas, das Sie für Ihren Grenzfall verwenden können. Also etwas in der Art von:

In Ihrer 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;

Und dann auf Ihrer 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();
}

Alternativ könnte man natürlich auch schon die richtige $removedPageId setzen Wert während der Erstellung Ihrer Revision , dann müssen Sie beim Entfernen nicht einmal einen Lebenszyklus-Callback ausführen.