2013-08-27 65 views
2

我在兩個實體Campsite和WeatherForecast之間有一對多關聯。 在向營地添加新預測之前,我想清除所有現有的地圖。我嘗試以下操作,但不執行任何刪除查詢。任何人都可以闡明這一點?無法清除教義2集合

$campsite = $campsiteRepository->find('campsite-2013-100006'); 

echo $campsite->getForecasts()->count() . PHP_EOL; //Outputs 7 

$campsite->getForecasts()->clear(); 

echo $campsite->getForecasts()->count(); //Outputs 0 

$em->persist($campsite); 
$em->flush(); 

營地實體

/** 
* @ORM\OneToMany(targetEntity="AcsiCampsiteWeather\Entity\Forecast", mappedBy="campsite") 
* @var \Doctrine\Common\Collections\ArrayCollection $forecasts 
*/ 
protected $forecasts = null; 

預測實體

/** 
* @ORM\ManyToOne(targetEntity="AcsiCampsite\Entity\Campsite", inversedBy="forecasts", fetch="LAZY") 
* @ORM\JoinColumn(name="relationID", referencedColumnName="relationID", nullable=false) 
* @var \AcsiCampsite\Entity\Campsite $campsite 
*/ 
protected $campsite = null; 
+0

您能否爲兩個實體顯示您的映射配置? – Exander

+0

當然,我明天在工作時編輯帖子 –

+0

@Exander,我添加了相關的註釋 –

回答

0

此行爲是正確的,因爲,according to the docs,關聯的一對多方總是反側,並且對其所做的更改將不會被保留。您需要將更改應用到擁有方。但是如果你希望你的對象圖保持一致(如果你打算在代碼中稍後處理預測的集合),不要忘記改變反面。所以,最後,我想代碼應該是這個樣子:

$campsite = $campsiteRepository->find('campsite-2013-100006'); 
foreach($campsite->getForecasts() as $forecast) { 
    $em->remove($forecast); 
} 

$campsite->getForecasts()->clear(); 

// your entities should already be tracked by the Unit of Work, so you shoudn't need to do this 
// $em->persist($campsite); 
$em->flush(); 

我想你也可以在annotaion您一對多協會指定orphanRemoval=true(據我瞭解,各預測總是綁定到一個營地一次,然後刪除)。儘管我從來沒有這樣做,因爲我更喜歡明確。

有關使用關聯的信息,另請參閱this page of the reference