我在两个实体Campsite和WeatherForecast之间有一个oneToMany关联。 在向营地添加新预测之前,我想清除所有现有的预测。我尝试以下操作,但不执行任何删除查询。任何人都可以对此有所了解吗?
$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 :(得分:0)
这种行为是正确的,因为according to the docs,关联的oneToMany端始终是反面,对它的更改将不会被持久化。您需要将更改应用于拥有方。但是,如果您希望对象图保持一致(如果您计划稍后在代码中使用预测集合),也不要忘记更改反面。所以,最后,我想代码应该是这样的:
$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();
我想你也可以在oneToMany关联的注释中指定orphanRemoval=true(据我所知,每个预测总是绑定到一个露营地,然后删除)。虽然不知怎的,我从来没有这样做,因为我更喜欢明确。
有关使用关联的信息,请参阅this page of the reference。