2011-10-14 63 views
10

你好,我嘗試級聯刪除OneToMany關係中的實體時有問題。 經過幾個小時的調試,我試圖將原理從最新的2.1.2降級到2.0.2,並且突然開始工作。Doctrine 2.0 vs 2.1 cascade刪除OneToMany

想象兩個實體公司和地址關係1:N。

/** 
* @Entity 
*/ 
class Company extends Entity 
{ 

/** 
    * @var integer 
    * @id @Column(type="integer") 
    * @generatedValue 
    */ 
private $id; 

/** 
    * @var Collection 
    * @OneToMany(targetEntity="Address",mappedBy="company", cascade={"persist","remove"}) 
    */ 
private $addresses; 
} 



/** 
* @Entity 
*/ 
class Address extends Entity 
{ 

/** 
    * @var integer 
    * @id @Column(type="integer") 
    * @generatedValue 
    */ 
private $id; 

/** 
    * @var Company 
    * @ManyToOne(targetEntity="Company", inversedBy="addresses") 
    * @JoinColumn(name="company_id", referencedColumnName="id",nullable=false) 
    */ 
private $company; 
} 

當我嘗試刪除實體公司時,我想分配的地址也將被刪除。

$em->remove($company); 
$em->flush(); 

在原則2.1.2中,不執行刪除地址,因此完整性約束失敗。在2.0.2版本中,它完美地工作。奇怪的是,如果我使用EntityAudit擴展https://github.com/simplethings/EntityAudit,LogRevisionListener在教條2.1.2(當然也是2.0.2)中正確版本化地址實體(將它們設置爲revtype = DEL),但UnitOfWork並未將其刪除。

如何處理2.0.2和2.1.2中的級聯移除有什麼區別?

非常感謝您

+0

今天我也偶然發現了這個問題,我正在使用2.1.6。 :/ – mokagio

+0

好吧,我必須改正我的自我,現在對我有用!我使用'cascade = {「all」}',但是當我在'cascade = {「remove」}中改變它時''一切都開始正常工作。 – mokagio

+0

雖然我不得不說,可能我的問題可能不完全是由於註釋集或學說本身,因爲我正在對實體進行強化操作,並且在對級聯選項的組合進行了一些測試之後,我發現「合併」選項是一個給出問題的選項。 希望它有幫助:) – mokagio

回答

1

我已經與代碼遇到了同樣的問題,我已經解決了他:

$em->remove($object); 
$em->flush(); 
$em->remove($user); 
$em->flush(); 

也許你可以在你的company使用findAll的地址,並刪除此一個foreach這樣的:

// Return all the addresses of the company 
$addresses = $em->getRepository(...)->findAllAddressesByCompany($company); 
$em->remove($company); 
foreach ($address in $addresses) 
{ 
    $em->remove($address); 
} 

這不是一個很好的方法,但就目前而言,這就是我的一切。找到。

+1

我已經解決了降級原則:)謝謝,但它不是我正在尋找的方法:(它可能可能是一個錯誤(或功能?) – stefi

10

嘗試在您Company類的addresses屬性

@OneToMany(targetEntity="Address",mappedBy="company", 
cascade={"persist"}, orphanRemoval=true) 
+1

我是使用教條2.2.3和仍然是相同的。不得不添加orphanRemoval = true。有點奇怪,因爲我沒有刪除一邊,所以沒有創建任何孤兒。也許是因爲許多方面是擁有一方,我從一邊刪除。更新工作,因爲許多方面是擁有一方,我都使用'$ this-> addSomething(theThing)'和'theThing-> setSomething($ this)'在哪裏好像我刪除Thing沒有設置的東西,只有'$ this-> removeSomething(theThing)' – HMR

3

我有同樣的問題用這個...關係添加或更新,但不會被刪除,即使我有級聯:堅持, 去掉]。

我發現我並不需要「級聯」中的「刪除」屬性,但我必須添加orphanRemoval:true。

我瘋了,你讓我的一天!