Doctrine2级联删除不适用于抽象类

时间:2014-03-21 06:54:28

标签: php symfony doctrine-orm

在我的使用Symfony2构建的Web应用程序中,包含以下实体:

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

    /**
     * @ORM\OneToMany(targetEntity="MappedSuperclass", mappedBy="entity", cascade={"persist", "remove"})
     */
    private $mappedSuperclasses;
}

/**
 * @ORM\MappedSuperclass
 */
abstract class MappedSuperclass
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(name="id", type="integer")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Entity", inversedBy="mappedSuperclasses")
     * @ORM\JoinColumn(name="entity_id", referencedColumnName="id", nullable=false)
     */
    protected $entity;
}

/**
 * @ORM\Entity
 * @ORM\Table(name="table_1")
 */
class Subclass1 extends MappedSuperclass
{
    /**
     * @ORM\Column(name="unique_member", type="string")
     */
    private $uniqueMember;
}

/**
 * @ORM\Entity
 * @ORM\Table(name="table_2")
 */
class Subclass2 extends MappedSuperclass
{
    /**
     * @ORM\Column(name="unique_member", type="string")
     */
    private $uniqueMember; // This is different from Subclass1
}

我会解释一下。 Entity的集合为MappedSuperclassMappedSuperclass是一个抽象类,包含其子类的一些公共变量。 Subclass1Subclass2MappedSuperclass的子类。从数据库中删除Entity后,$mappedSuperclasses中的项目应一起删除,这就是设置cascade={"persist", "remove"}的原因。

但是,当我尝试删除Entity时,出现以下错误:

ContextErrorException: Notice: Undefined index: entity in C:\project\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php line 1753

如果我将targetEntity的{​​{1}}更改为Entity::$mappedSuperclassesSubclass1,则会有效。我的设置无法实现Subclass2吗?我错过了什么?

2 个答案:

答案 0 :(得分:0)

我通过将ON DELETE操作设置为数据库级别来解决此问题:

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

/**
 * @ORM\MappedSuperclass
 */
abstract class MappedSuperclass
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(name="id", type="integer")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Entity")
     * @ORM\JoinColumn(name="entity_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
     */
    protected $entity;
}

来源:[1] [2]

答案 1 :(得分:0)

我在问题解决后的一年回答,但我遇到了同样的问题。当我尝试清空count countCollection时发生错误。

因此,解决方案是检查$ this->实体是否为数组,然后返回其长度。