【问题标题】:Symfony2 Doctrine ORM cascade detach not workingSymfony2 Doctrine ORM级联分离不起作用
【发布时间】:2015-01-19 18:58:29
【问题描述】:

我有两个类通过 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;

    .....

}

【问题讨论】:

    标签: php symfony orm doctrine-orm


    【解决方案1】:

    detach 操作用于当您希望 EntityManager 停止管理它时,但“分离”与“删除”不同。使用cascade={"remove"} 并查看文档中的"Working with associations" 部分。

    class Document
    {
        .....
    
        /**
         * Measurement Data
         * 
         * @var type 
         * 
         * @ORM\OneToMany(targetEntity="MeasurementData", mappedBy="document", cascade={"remove"})
         */
        protected $measurementData;
    
        .....
    
    }
    

    【讨论】:

      【解决方案2】:

      Falc 所说的是回答他的真实情况,但您仍然可以使用 onDelete="CASCADE" 注释(它们在某种程度上是“等效的”;请阅读下文)

      onDelete="CASCADE"cascade={"remove"} 的主要区别在于前者是由教义使用DBMS的级联机制(所以DBMS将负责删除操作)而后者是由教义本身使用的(所以“应用level") 做一些explicit 删除查询。

      就您而言,据我们从您的示例中得知,onDelete="CASCADE" 无法正常工作,因为您可能忘记使用 php app/consolle doctrine:schema:update --force CLI 命令更新架构。

      【讨论】:

        【解决方案3】:

        感谢您的帮助,但我仍然无法让注释正常工作 我已经阅读了几次文档,但我想出了 现在这个简单的解决方案(在我的文档控制器中删除操作) 也许没有办法,虽然注释,但它肯定会很好。

        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();
        
            ...
        }
        

        【讨论】:

          猜你喜欢
          • 2013-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-19
          • 1970-01-01
          相关资源
          最近更新 更多