关系OneToOne级联="持久,删除"不起作用

Iva*_*lan 4 symfony doctrine-orm

我有一个关系OneToOne双向,配置如何级联persis,删除,但当我调用控制器removarPersonaFisicaAction时,这显示下一个错误:

An exception occurred while executing 'DELETE FROM entidad WHERE id = ?' with params [84]:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`xxx`.`personafisica`, CONSTRAINT `FK_D55D20169B1A19BB` FOREIGN KEY (`id_entidad`) REFERENCES `entidad` (`id`)) 
Run Code Online (Sandbox Code Playgroud)

这是我在实体中的配置:第一个实体:

//code
/**
     * @ORM\OneToOne(targetEntity="XXX\EntidadBundle\Entity\PersonaFisica", mappedBy="entidad", cascade={"persist", "remove"})
     * @ORM\JoinColumn(name="persona_fisica_id", referencedColumnName="id")
     **/
    private $personaFisica;
//code
Run Code Online (Sandbox Code Playgroud)

第二实体:

//code
/**
     * @ORM\OneToOne(targetEntity="XXX\EntidadBundle\Entity\Entidad", inversedBy="personaFisica", cascade={"persist", "remove"})
     * @ORM\JoinColumn(name="id_entidad", referencedColumnName="id")
     */
    protected $entidad;
//code
Run Code Online (Sandbox Code Playgroud)

eliminarPersonaFisicaAction:

public function eliminarPersonaFisicaAction($id){
    $em = $this->getDoctrine()->getManager();
    $personaFisica = $em->getRepository("EntidadBundle:Entidad")->find($id);
    if($personaFisica->getPresupuestosEnLosQueEsContacto()->isEmpty() && $personaFisica->getPresupuestos()->isEmpty() && $personaFisica->getDocumentos()->isEmpty() && $personaFisica->getAsignacionesExternas()->isEmpty()){
        $em->remove($personaFisica);
    }
    $em->flush();
    return $this->redirect($this->generateUrl('ver_personas_fisicas'));
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*hka 6

请注意,cascade={"persist", "remove"}仅影响内部Doctrine2持久性和删除.它与数据库无关.

为了告诉DB明确地将'onDelete'属性添加到您应该onDelete="CASCADE"JoinColumnconfig中使用的列.

//code
/**
     * @ORM\OneToOne(targetEntity="XXX\EntidadBundle\Entity\PersonaFisica", mappedBy="entidad", cascade={"persist", "remove"})
     * @ORM\JoinColumn(name="persona_fisica_id", referencedColumnName="id", onDelete="CASCADE")
     **/
    private $personaFisica;
//code
Run Code Online (Sandbox Code Playgroud)

您不需要JoinColumn在两个表上指定,只有一个表具有额外的id字段就足够了.从我在您的代码中看到的,您应该添加JoinColumn到Entidad实体.这将使删除PersonaFisica时删除Entidad实体.