在删除级联与教义2

新手上路,请多包涵

我试图做一个简单的例子,以了解如何从父表中删除一行,并使用 Doctrine2 自动删除子表中的匹配行。

这是我正在使用的两个实体:

儿童.php:

 <?php

namespace Acme\CascadeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="child")
 */
class Child {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\ManyToOne(targetEntity="Father", cascade={"remove"})
     *
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="father_id", referencedColumnName="id")
     * })
     *
     * @var father
     */
    private $father;
}

父亲.php

 <?php
namespace Acme\CascadeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="father")
 */
class Father
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
}

表已在数据库上正确创建,但未创建 On Delete Cascade 选项。我究竟做错了什么?

原文由 rfc1484 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 304
1 个回答

Doctrine 中有两种级联:

  1. ORM 级别 - 在关联中使用 cascade={"remove"} - 这是在 UnitOfWork 中完成的计算,不会影响数据库结构。当您删除一个对象时, UnitOfWork 将遍历关联中的所有对象并删除它们。

  2. 数据库级别 - 在关联的 joinColumn 上使用 onDelete="CASCADE" 这会将 On Delete Cascade 添加到数据库中的外键列:

    @ORM\JoinColumn(name="father_id", referencedColumnName="id", onDelete="CASCADE")

我还想指出,你现在拥有 cascade={"remove"} 的方式,如果你删除一个子对象,这个级联将删除父对象。显然不是你想要的。

原文由 Michael Ridgway 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏