2014-09-02 108 views
2

当试图级联删除具有一对一和一对多双向关系的实体时,我收到了外部约束违规。 这是我的四个实体相关的这种方式:“用户”对象可能有零或一个“联系”。联系人可能有零个或一个“地址”和零个或多个“电话”。但是,“联系人”必须与“用户”实体以及“联系人”实体的“地址”和“电话”相关联。Doctrine 2 - 无法级联删除具有双向关系的实体

我的目标是,当我删除一个“用户”所有的子对象也被级联删除(“联系”,“地址”和“电话”)。但是,当我删除一个子对象时,我只是希望它的父实体中的引用ID被设置为NULL。

我试过几种方法,包括选项onDelete =“CASCADE”和onDelete = NULL,但我仍然得到了外部约束违规错误。

用户实体

class User 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* Contact 
* 
* @ORM\OneToOne(targetEntity="Contact", mappedBy="user", cascade={"persist", "remove"}) 
* @ORM\JoinColumn(nullable=true) 
*/ 
private $contact; 

... 

} 

联系实体

class Contact 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* Address 
* 
* @ORM\OneToOne(targetEntity="Address", mappedBy="contact", cascade={"persist", "remove"}) 
* @ORM\JoinColumn(nullable=true) 
*/ 
private $address; 

/** 
* Telephones 
* 
* @ORM\OneToMany(targetEntity="Telephone", mappedBy="contact", cascade={"persist", "remove"}) 
* @ORM\JoinColumn(nullable=true) 
*/ 
private $telephones; 

/** 
* User 
* 
* @ORM\OneToOne(targetEntity="User", inversedBy="contact", cascade={"persist"}) 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false) 
*/ 
private $user; 

/** 
* Constructeur 
*/ 
public function __construct() 
{ 
    $this->telephones = new ArrayCollection(); 
} 

... 

} 

地址实体

class Address 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\OneToOne(targetEntity="Contact", inversedBy="address", cascade={"persist"}) 
* @ORM\JoinColumn(name="contact_id", referencedColumnName="id", nullable=false) 
*/ 
private $contact; 

... 

} 

电话实体

class Telephone 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\ManyToOne(targetEntity="Contact", inversedBy="telephones", cascade={"persist"}) 
* @ORM\JoinColumn(name="contact_id", referencedColumnName="id", nullable=false) 
*/ 
private $contact; 

... 

} 
+0

什么是错误 – 2014-09-02 11:40:43

+0

“无法删除或更新父行:外键约束失败('eds'.'eds_contact',CONSTRAINT'FK_E2314CF8FB88E14F' FOREIGN KEY('user_id')REFERENCES'eds_user'('id')) “ – Glesker 2014-09-02 12:24:51

回答

1

试试这个配置。我只通过添加onDelete="CASCADE"@ORM\JoinColumn注释进行了更改。这使用内置的数据库级联,因此您需要更新您的模式。 我也删除了一些无关的非关联方的注释@ORM\JoinColumn(nullable=true)。这些没有效果,只是误导。

用户实体

class User 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* Contact 
* 
* @ORM\OneToOne(targetEntity="Contact", mappedBy="user", cascade={"persist", "remove"}) 
*/ 
private $contact; 

... 

} 

联系实体

class Contact 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* Address 
* 
* @ORM\OneToOne(targetEntity="Address", mappedBy="contact", cascade={"persist", "remove"}) 
*/ 
private $address; 

/** 
* Telephones 
* 
* @ORM\OneToMany(targetEntity="Telephone", mappedBy="contact", cascade={"persist", "remove"}) 
*/ 
private $telephones; 

/** 
* User 
* 
* @ORM\OneToOne(targetEntity="User", inversedBy="contact", cascade={"persist"}) 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false, onDelete="CASCADE") 
*/ 
private $user; 

/** 
* Constructeur 
*/ 
public function __construct() 
{ 
    $this->telephones = new ArrayCollection(); 
} 

... 

} 

地址实体

class Address 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\OneToOne(targetEntity="Contact", inversedBy="address", cascade={"persist"}) 
* @ORM\JoinColumn(name="contact_id", referencedColumnName="id", nullable=false, onDelete="CASCADE") 
*/ 
private $contact; 

... 

} 

电话实体

class Telephone 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\ManyToOne(targetEntity="Contact", inversedBy="telephones", cascade={"persist"}) 
* @ORM\JoinColumn(name="contact_id", referencedColumnName="id", nullable=false, onDelete="CASCADE") 
*/ 
private $contact; 

... 

} 
+0

谢谢汤姆,它工作正常!我担心删除非拥有方的JoinColumn注解可能会删除双向关系。我错了... – Glesker 2014-09-03 10:11:43

1
$user->setContact(null); 
$contact->setUser(null); 

$em->remove($user); 
$em->remove($contact);