2013-08-27 3 views
2

Campsite와 WeatherForecast라는 두 엔티티간에 oneToMany 연결이 있습니다. 캠프장에 새로운 예측 정보를 추가하기 전에 기존 정보를 모두 지우고 싶습니다. 다음을 시도하지만 삭제 쿼리는 전혀 실행되지 않습니다. 누구든지 이것에 관해 밝힐 수 있습니까?doctrine 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 때문에, 연관의 oneToMany 측 항상 반대 측이며 변경 사항은 유지되지 않습니다. 변경 사항을 소유 측에 적용해야합니다. 그러나 오브젝트 그래프가 일관성있게 유지되기를 원한다면 반대쪽을 변경하는 것을 잊지 마십시오 (코드의 뒷부분에있는 예측의 콜렉션 작업을 계획하고 있다면). 그래서, 결국, 나는 코드는 다음과 같이 보일 것입니다 가정 : 난 당신이 또한 지금까지의 내가 이해 한대로 (당신의 oneToMany 협회의 annotaion에 orphanRemoval=true를 지정할 수 있습니다 가정

$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(); 

을, 각각의 예측은 항상 한 번 캠프장에 묶인 후 삭제됨). 비록 내가 명시 적으로 선호하는 것처럼 어떻게 든 나는 이것을 한 적이 없지만.

연관성에 대한 정보는 this page of the reference을 참조하십시오.

관련 문제