sql >> Base de Datos >  >> RDS >> Mysql

Deshabilitar la restricción de clave externa de Doctrine

Por definición no puede eliminar el registro al que apunta la clave externa sin establecer la clave en nulo (onDelete="SET NULL" ) o en cascada la operación de eliminación (Hay dos opciones - Nivel ORM:cascade={"remove"} | nivel de base de datos:onDelete="CASCADE" ).
Existe la alternativa de establecer un valor predeterminado de un registro aún existente , pero tiene que hacerlo manualmente, no creo que Doctrine admita este "listo para usar" (corríjame si me equivoco, pero en este caso no se desea establecer un valor predeterminado de todos modos).

Este rigor refleja el concepto de tener restricciones de clave externa; como dijo @Théo:

La eliminación temporal (ya mencionada) es una solución, pero lo que también podría hacer es agregar un removed_page_id adicional. columna que sincroniza con el page_id justo antes de eliminarlo en un preRemove controlador de eventos (devolución de llamada del ciclo de vida). Me pregunto si dicha información tiene algún valor, pero supongo que tiene algún uso para ella, de lo contrario no haría esta pregunta.

Definitivamente no estoy diciendo que esto sea una buena práctica , pero al menos es algo que puede usar para su caso extremo. Así que algo en la línea de:

En su 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;

Y luego en tu 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();
}

Alternativamente, por supuesto, ya podría establecer el $removedPageId correcto valor durante la construcción de su Revision , entonces ni siquiera necesita ejecutar una devolución de llamada del ciclo de vida al eliminar.