例如,我有像User,Item,Image这样的实体。用户有很多项目。物品有很多图像。
我应该选择哪种删除选项,cascade = {'删除'}或onDelete = Cascade? p>
此外,我在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"或级联= {'删除'}这类情况?
答案 0 :(得分:0)
onDelete='CASCADE'
将添加SQL级别ON DELETE CASCADE
。是的,图像将从表中删除。这非常有效,因为数据库处理删除。
要让名为cascade={'remove'}
的监听器成为必要。这使得Doctrine获取对象的图形,这个图形较慢。
两个选项可以同时指定。在这种情况下,Doctrine将按照最后一段中的描述行事,但DELETE
不是来自Doctrine也会正确地级联;在这种情况下,显然不会调用任何听众。
我倾向于仅在这种情况下指定cascade={'remove'}
以避免在没有调用侦听器的情况下意外DELETE
(如果没有未引用文件的清除任务)。