Symfony2 Doctrine ORM级联分离不起作用

时间:2014-11-21 15:20:11

标签: php symfony orm doctrine-orm

我有两个由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;

    .....

}

3 个答案:

答案 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();

    ...
}