我有两个由ORM OneToMany关系链接在一起的类
我想要实现的是:当我删除文档时,MeasurementData 实体不会从数据库中删除。
我尝试过设置注释:@ORM \ JoinColumn(onDelete =" CASCADE")
但它仍然没有效果。有没有人知道这个严重记录的正确解决方案 Symfony2 / Doctrine ORM中的功能
class Document
{
.....
/**
* Measurement Data
*
* @var type
*
* @ORM\OneToMany(targetEntity="MeasurementData", mappedBy="document", cascade={"detach"})
*/
protected $measurementData;
.....
}
class MeasurementData
{
.....
/**
* Document
*
* @var \Entity\Document
*
* @ORM\ManyToOne(targetEntity="Document", inversedBy="measurementData")
* @ORM\JoinColumn(name="documentId", referencedColumnName="id")
*/
protected $document;
.....
}
答案 0 :(得分:2)
当您希望EntityManager停止管理它时使用detach
操作,但“detach”与“remove”不同。使用cascade={"remove"}
并查看文档中的"Working with associations"部分。
class Document
{
.....
/**
* Measurement Data
*
* @var type
*
* @ORM\OneToMany(targetEntity="MeasurementData", mappedBy="document", cascade={"remove"})
*/
protected $measurementData;
.....
}
答案 1 :(得分:1)
Falc所说的是回答他的真实,但你仍然可以使用onDelete="CASCADE"
注释(它们是#34;等同于#34;以某种方式;请参阅下文)
onDelete="CASCADE"
和cascade={"remove"}
之间的主要区别在于,第一个被doctrine用来使用DBMS的级联机制(因此DBMS将负责删除操作)而后者则由doctrine本身使用(所以"应用程序级别")执行一些explicit
删除查询。
在您的情况下,根据您的示例,onDelete="CASCADE"
无法正常工作,因为您可能忘记使用php app/consolle doctrine:schema:update --force
CLI命令更新架构。
答案 2 :(得分:0)
感谢您的帮助,但我仍然无法使注释正常工作 我已经阅读了几次文档,但我已经提出了 这个简单的解决方案现在(在我的文档Controller中删除动作) 也许除了注释之外没有任何办法,但它肯定会很好。
public function deleteAction($id)
{
...
$measurements = $em->getRepository('ChemRadeBundle:MeasurementData')->findBy(array(
'document' => $document
));
foreach ($measurements as $measurement) {
$measurement->setDocument(null);
$em->persist($measurement);
}
$em->remove($document);
$em->flush();
...
}