Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Desabilitar restrição de chave estrangeira do Doctrine


Por definição você não pode excluir o registro para o qual a chave estrangeira está apontando sem definir a chave como nula (onDelete="SET NULL" ) ou em cascata a operação de exclusão (Existem duas opções - Nível ORM:cascade={"remove"} | nível de banco de dados:onDelete="CASCADE" ).
Existe a alternativa de definindo um valor padrão de um registro ainda existente , mas você tem que fazer isso manualmente, eu não acho que o Doctrine suporte este "out-of-the-box" (por favor me corrija se eu estiver errado, mas neste caso definir um valor padrão não é desejado de qualquer maneira).

Essa rigidez reflete o conceito de ter restrições de chave estrangeira; como @Théo disse:

A exclusão reversível (já mencionada) é uma solução, mas o que você também pode fazer é adicionar um removed_page_id adicional coluna que você sincroniza com o page_id pouco antes de excluí-lo em um preRemove manipulador de eventos (retorno de chamada do ciclo de vida). Se tal informação tem algum valor, eu me pergunto, mas acho que você tem algum uso para isso, caso contrário, você não faria essa pergunta.

Definitivamente, não estou afirmando que isso é uma boa prática , mas é pelo menos algo que você pode usar para o seu caso extremo. Então, algo na linha de:

Em sua 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;

E então em sua 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();
}

Como alternativa, é claro que você já pode definir o $removedPageId correto valor durante a construção de sua Revision , você nem precisará executar um retorno de chamada de ciclo de vida na remoção.