我试图做一个简单的例子,以学习如何从父表中删除一行并使用Doctrine2自动删除子表中的匹配行。
这是我正在使用的两个实体:
Child.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; }
这些表已在数据库上正确创建,但未创建“删除级联”选项。我究竟做错了什么?
在教义中有两种级联:
1)ORM级别- cascade={"remove"}在关联中使用- 这是在UnitOfWork中完成的计算,不影响数据库结构。删除对象时,UnitOfWork将遍历关联中的所有对象并将其删除。
cascade={"remove"}
2)数据库级别- onDelete="CASCADE"在关联的joinColumn上使用-这会将On Delete Cascade添加到数据库的外键列中:
onDelete="CASCADE"
@ORM\JoinColumn(name="father_id", referencedColumnName="id", onDelete="CASCADE")
我还要指出的是,您现在具有层叠= {“ remove”}的方式,如果删除Child对象,则此层叠将删除Parent对象。显然不是您想要的。