Doctrine 2:ManyToOne级联删除导致引用的实体被删除

时间:2016-09-19 08:15:31

标签: php doctrine-orm cascade cascading-deletes

我有一个设置,我有产品Feed,每个Feed都有很多产品。非常简化的设置看起来像这样:

Feed模型:

/**
 * Class Feed represents a single feed as supplier by a supplier
 * @package App\Model
 * @Entity @Table(name="feeds")
 */
class Feed
{
    /**
     * @var int
     * @Id @Column(type="integer") @GeneratedValue
     */
    protected $id;
}

产品型号:

/**
 * Class Product is the base for either supplied and current products
 * @package App\Model
 */
class Product
{
    /**
     * @var int
     * @Id @Column(type="integer") @GeneratedValue
     */
    protected $id;

    /**
     * @var Feed
     * @ManyToOne(targetEntity="App\Model\Feed", cascade={"remove"})
     * @JoinColumn(name="id_feed", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $feed;
}

现在您可以看到我启用了级联,因为我希望在删除Feed后自动删除所有产品。

然而......目前,当我删除产品时,它也会导致原始Feed被删除。我怀疑它与如何设置关系有关,但我似乎无法弄清楚它在哪里出错。

任何人都可以对这种情况有更多的了解吗?

1 个答案:

答案 0 :(得分:1)

Feed模型:

    /**
     * Class Feed represents a single feed as supplier by a supplier
     * @package App\Model
     * @Entity @Table(name="feeds")
     */
    class Feed
    {
        /**
         * @var int
         * @Id @Column(type="integer") @GeneratedValue
         */
         protected $id;

       /**
        * @var Feed
        * @OneToMany(targetEntity="App\Model\Product", mappedBy="feed", orphanRemoval=true, cascade={"remove"})
        * 
        */
        protected $products;    

    }

产品型号:

/**
 * Class Product is the base for either supplied and current products
 * @package App\Model
 */
class Product
{
    /**
     * @var int
     * @Id @Column(type="integer") @GeneratedValue
     */
    protected $id;

    /**
     * @var Feed
     * @ManyToOne(targetEntity="App\Model\Feed", inversedBy="products")
     * @JoinColumn(name="id_feed", referencedColumnName="id")
     */
    protected $feed;
}

现在,如果删除Feed对象,则也会删除链接到此Feed的Product对象。

这是双向关系。

更多信息:

<强>级联= {&#34;除去&#34;}

  • 反对方的实体将被删除,而拥有方(Feed)将被删除,但前提是实体(产品)不属于Feed以外的其他方。

<强> orphanRemoval =&#34;真&#34;

  • 与上述相同,但如果实体(产品)归另一个实体所有,则ORM会忽略