2013-02-22 29 views
0

例如,我有像User,Item,Image这样的实体。用户有很多项目。物品有很多图像。在原则2中删除操作

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

此外,我有图像上的生命周期回调。我知道上述级联选项的区别。我想知道如果我使用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); 
    } 
} 

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

回答

0

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

让听众调用cascade={'remove'}是必要的。这使得Doctrine获取对象的图形,这是较慢的。

两个选项可以同时指定。在这种情况下,学说将按照最后一段所述行事,但不是来自教义的DELETE也会正确地级联;在这种情况下听众将不会被明确地调用。

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

详情请见Doctrine documentation

+0

所以我应该在$ User-> items,$ Item-> images或$ Item-> images中添加cascade = {“remove”}?我正在谈论删除用户时的情况。 – sonam 2013-02-22 15:07:25

+0

您应该将'cascade = {“remove”}'添加到'User-> items'和'Item-> images'。您可能还想考虑[其他级联操作](http://docs.doctrine-project.org/zh/2.0.x/reference/working-with-associations.html#transitive-persistence-cascade-operations)但他们不太感兴趣。 – 2013-02-23 08:07:09