我试图做一个简单的例子,以了解如何从父表中删除一行,并使用 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 许可协议
Doctrine 中有两种级联:
ORM 级别 - 在关联中使用
cascade={"remove"}
- 这是在UnitOfWork
中完成的计算,不会影响数据库结构。当您删除一个对象时,UnitOfWork
将遍历关联中的所有对象并删除它们。数据库级别 - 在关联的 joinColumn 上使用
onDelete="CASCADE"
这会将 On Delete Cascade 添加到数据库中的外键列:我还想指出,你现在拥有
cascade={"remove"}
的方式,如果你删除一个子对象,这个级联将删除父对象。显然不是你想要的。