删除学说2中的操作

时间:2013-02-22 03:28:15

标签: doctrine-orm doctrine

例如,我有像User,Item,Image这样的实体。用户有很多项目。物品有很多图像。

我应该选择哪种删除选项,cascade = {'删除'}或onDelete = Cascade?

此外,我在Image上有生命周期回调。我知道上面提到的级联选项之间的区别。我想知道我是否使用onDelete = cascade选项,在删除User对象时,是否会调用像PostRemove()这样的生命周期回调?

以下是我的实体:

//User.php
class User {
   /**
    * @ORM\OneToMany(targetEntity="Item", mappedBy="user", onDelete="CASCADE")
    */
    private $items;
}

//Item.php
class Item {
   /**
   * @var User
   *
   * @ORM\ManyToOne(targetEntity="User", inversedBy="items")
   * @ORM\JoinColumns({
   *   @ORM\JoinColumn(name="user_id", referencedColumnName="id")
   * })
   */
   private $user;
   /**
    * @ORM\OneToMany(targetEntity="ItemImage", mappedBy="item",onDelete="CASCADE")
    */
   protected $images;

}

//ItemImage.php
class ItemImage {
   /* Setters and getter **/
   /**
   * @var Items
   *
   * @ORM\ManyToOne(targetEntity="Item", inversedBy="images")
   * @ORM\JoinColumns({
   *   @ORM\JoinColumn(name="item_id", referencedColumnName="id")
   * })
   */
   private $item;
   /**
   * @ORM\PostRemove()
   */
    public function removeUpload() {
       unlink($this->getUploadDir() . '/' . $this->imageName);
    }
 }

我的问题是,当用户被删除时,是否会删除与用户相关的所有项目以及与项目相关的图像?我还希望在删除User时调用Image实体的PostRemove()回调?我应该使用哪个选项,onDelete =" cascade"或级联= {'删除'}这类情况?

1 个答案:

答案 0 :(得分:0)

onDelete='CASCADE'将添加SQL级别ON DELETE CASCADE。是的,图像将从表中删除。这非常有效,因为数据库处理删除。

要让名为cascade={'remove'}的监听器成为必要。这使得Doctrine获取对象的图形,这个图形较慢。

两个选项可以同时指定。在这种情况下,Doctrine将按照最后一段中的描述行事,但DELETE不是来自Doctrine也会正确地级联;在这种情况下,显然不会调用任何听众。

我倾向于仅在这种情况下指定cascade={'remove'}以避免在没有调用侦听器的情况下意外DELETE(如果没有未引用文件的清除任务)。

详情可在Doctrine documentation

中找到