2

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

1 回答 1

0

这种行为是正确的,因为根据文档,关联的 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 (据我所知,每个预测总是与一个露营地绑定一次,然后删除)。虽然不知何故我从来没有这样做过,因为我更喜欢明确。

另请参阅参考资料的此页面,了解有关使用关联的信息。

于 2013-09-12T14:33:56.150 回答