一尘不染

关于使用doctrine2删除级联

php

我试图做一个简单的例子,以学习如何从父表中删除一行并使用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;
}

这些表已在数据库上正确创建,但未创建“删除级联”选项。我究竟做错了什么?


阅读 197

收藏
2020-05-26

共1个答案

一尘不染

在教义中有两种级联:

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

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

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

我还要指出的是,您现在具有层叠= {“ remove”}的方式,如果删除Child对象,则此层叠将删除Parent对象。显然不是您想要的。

2020-05-26