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)
请注意,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实体.
| 归档时间: |
|
| 查看次数: |
6400 次 |
| 最近记录: |