2014-09-02 74 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);