簡體   English   中英

Doctrine2級聯刪除不適用於Abstract Class

[英]Doctrine2 cascade delete doesn't work with Abstract Class

在我用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具有MappedSuperclass的集合。 MappedSuperclass是一個抽象類,其中包含一些子類的公共變量。 Subclass1Subclass2MappedSuperclass Subclass2類。 當從數據庫中刪除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

如果我將Entity::$mappedSuperclassestargetEntity更改為Subclass1Subclass2 ,它將起作用。 我的設置無法實現ON DELETE CASCADE嗎? 我想念什么?

我通過將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]

問題解決后,我回答了一年,但我遇到了同樣的問題。 當我嘗試清空countArrayCollection時發生錯誤。

因此解決方案是檢查$ this-> entity是否為array,然后返回其長度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM