我有一个地址实体,用于各种其他实体,有用户有地址,有商店和公司。
现在我尝试做的是确保在删除商店时自动删除地址,所以我尝试了这个:
/**
* Shop
*
* @ORM\Table(name="shop")
* @ORM\Entity
*/
class Shop {
/**
* @ORM\OneToOne(targetEntity="Address",cascade={"persist", "remove"})
* @ORM\JoinColumn(name="address", referencedColumnName="id",nullable=true, onDelete="CASCADE")
*/
private $address;
...
}
/**
* Address
*
* @ORM\Table(name="address")
* @ORM\Entity
*/
class Address {
//...
}
但这不符合我的要求,删除商店后地址仍然存在。我怎么能处理这个,有没有办法做到这一点?
谢谢!
答案 0 :(得分:1)
您只需添加级联remove
选项
/**
* Shop
*
* @ORM\Table(name="shop")
* @ORM\Entity
*/
class Shop {
/**
* @ORM\ManyToOne(targetEntity="Address", cascade={"persist, remove"})
* @ORM\JoinColumn(name="address", referencedColumnName="id")
*/
private $address;
...
}
onDelete="CASCADE"
表示删除嵌入式实体时,也必须删除父实体。它是在数据库级别处理的。
cascade={"remove"}
表示在删除父项时,必须删除嵌入式实体。它是在orm级别处理的。
请注意,您不需要在JoinColumn注释中指定nullable=true
,true是默认值。
评论后更新
如果您的实体只有一个地址,那么您应该使用OneToOne关系。如果你想要一个参考Shop in Address那么你想要一个双向的,否则你将有一个单向的。
单向:
/**
* Shop
*
* @ORM\Table(name="shop")
* @ORM\Entity
*/
class Shop {
/**
* @ORM\OneToOne(targetEntity="Address", cascade={"persist, remove"})
* @ORM\JoinColumn(name="address_id", referencedColumnName="id")
*/
private $address;
// ...
}
/**
* Address
*
* @ORM\Table(name="address")
* @ORM\Entity
*/
class Address {
// ...
}
双向:
/**
* Shop
*
* @ORM\Table(name="shop")
* @ORM\Entity
*/
class Shop {
/**
* @ORM\OneToOne(targetEntity="Address", mappedBy="shop", cascade={"persist, remove"})
*/
private $address;
// ...
}
/**
* Address
*
* @ORM\Table(name="address")
* @ORM\Entity
*/
class Address {
/**
* @ORM\OneToOne(targetEntity="Shop", inversedBy="address")
* @ORM\JoinColumn(name="shop_id", referencedColumnName="id")
*/
private $shop;
// Same for user / company
// ...
}