Doctrine orm 删除第2条中的行动

Doctrine orm 删除第2条中的行动,doctrine-orm,doctrine,Doctrine Orm,Doctrine,例如,我有像用户、项目、图像这样的实体。用户有许多项。项目有许多图像 我应该选择哪个删除选项,cascade={'remove'}还是onDelete=cascade 此外,我还有关于图像的生命周期回调。我知道上述级联选项之间的区别。我想知道在删除用户对象时是否使用了onDelete=cascade选项,是否会调用像PostRemove()这样的生命周期回调 以下是我的实体: //User.php class User { /** * @ORM\OneToMany(targetEn

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

我应该选择哪个删除选项,cascade={'remove'}还是onDelete=cascade

此外,我还有关于图像的生命周期回调。我知道上述级联选项之间的区别。我想知道在删除用户对象时是否使用了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 entity的PostRemove()回调?对于这种情况,我应该使用哪个选项,onDelete=“cascade”或cascade={'remove'}?

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

要让侦听器调用
cascade={'remove'}
是必需的。这会使我们获取对象的图形,这会更慢

两个选项可以同时指定。在这种情况下,条令将按最后一段所述执行,但并非来自条令的
DELETE
s也将正确级联;显然,在这种情况下不会调用侦听器

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


详细信息可以在.

中找到,所以我应该在$User->items、$Item->images中添加cascade={“remove”},还是只在$Item->images中添加?我说的是用户被删除的情况。您应该将
cascade={“remove”}
添加到
user->items
Item->images
。你可能也想考虑一下,但他们不太可能感兴趣。