无法清除学说2集合

时间:2013-08-27 07:08:25

标签: php doctrine-orm associations

我在两个实体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;

1 个答案:

答案 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