0

例如,我有像用户、项目、图像这样的实体。用户有很多项目。项目有很多图像。

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

我也有关于 Image 的生命周期回调。我知道上述级联选项之间的区别。我想知道我是否在删除用户对象时使用了 onDelete=cascade 选项,是否会调用像 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);
    }
 }

我的问题是当用户被删除时,与用户相关的所有项目和与项目相关的图像都会被删除吗?我还希望在删除用户时调用 Image 实体的 PostRemove() 回调?对于这种情况,我应该使用哪个选项,onDelete="cascade" 或 cascade={'remove'}?

4

1 回答 1

0

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

调用监听cascade={'remove'}器是必要的。这使得 Doctrine 获取对象的图表,速度较慢。

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

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

详细信息可以在Doctrine 文档中找到。

于 2013-02-22T11:01:24.573 回答