2015-11-18 57 views
2

我有關係OneToOne雙向,configurate如何級聯persis,刪除,但是當我打電話控制器eliminarPersonaFisicaAction,這表明下一個錯誤:關係OneToOne級聯=「保存,刪除」不行

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`)) 

這是我的配置實體: 一是實體:

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

二實體:

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

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')); 
} 
+0

你也可以在這裏放置'show create table'輸出嗎?看起來你對數據庫有問題,而不是教條。 – Stepashka

回答

4

請注意,cascade={"persist", "remove"}隻影響內部Doctrine2持久性和去除。它與數據庫無關。

爲了讓DB明確地將'onDelete'屬性添加到列中,您應該在JoinColumn配置中使用onDelete="CASCADE"

//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 

你並不需要在兩個表指定JoinColumn,就足夠了只有一個表有多餘的id字段。從我在代碼中看到的內容中,您應該添加JoinColumn到Entidad實體。當PersonaFisica被刪除時,這將使Entidad實體被刪除。

+0

是的,joinColumn不正確...但現在我得到下一個錯誤:注意:未定義的索引:persona_fisica_id,爲什麼@Stepashka? –

+0

對不起,我混淆了你與joinColumn。我的例子也是錯的。我已經從答案中刪除了它。通常joinColumn僅在一側定義。這使我困惑。我認爲目前的答案應該可以解決你的問題。 – Stepashka

+0

沒問題!但我已經配置了joinColum onDelete =「CASCADE」並繼續這個錯誤 –