无法清除学说 2 集合
Posted
技术标签:
【中文标题】无法清除学说 2 集合【英文标题】:Unable to clear doctrine 2 collection 【发布时间】:2013-08-27 07:08:25 【问题描述】:我在 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;
【问题讨论】:
能否请您显示两个实体的映射配置? 好的,明天上班的时候我会编辑帖子 @Exander,我已经添加了相关注释 【参考方案1】:这种行为是正确的,因为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,了解有关与协会合作的信息。
【讨论】:
以上是关于无法清除学说 2 集合的主要内容,如果未能解决你的问题,请参考以下文章