无法清除学说 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 集合的主要内容,如果未能解决你的问题,请参考以下文章

无法在学说 mongo 查询中增加值

无法通过docker上的学说连接到mysql DB

无法获得最后一个插入标识符 - 带有 mysql 视图的学说

在学说 2 中是不是可以有一个不是主键的自动增量列?

学说 2 在 Postgres 表列上窒息

是否可以在不删除数据库的情况下加载学说夹具