我对实体中的删除约束有些麻烦。
我有实体商品和实体车辆,商品中的商品数量多对一,因此商品只能在一辆车上,而车辆可能有很多商品。所以我有:
class Merchandise{
/**
* @ORM\ManyToOne(targetEntity="Vehicle",inversedBy="merchandise")
* @ORM\JoinColumn(name="vehicle", referencedColumnName="id")
*/
private $vehicle;
}
class Vehicle{
/**
* @ORM\OneToMany(targetEntity="Merchandise",mappedBy="vehicle")
*/
private $merchandise;
}
我想要的是,当我尝试删除有车辆的商品时,商品无法删除。 但我不知道如何设置ORM Level限制约束。我试过restrict = {“remove”}但它在@ORM \ OneToMany中不存在。 我也尝试使用preRemove函数返回false,但它不起作用:(
有什么想法吗?
感谢!!!
答案 0 :(得分:4)
ManyToOne / inversedBy是从学说的角度看双向关系的OWNING方面 - 这可能导致混淆。
要解决您的问题,请向商品实体添加级联操作。例如:
/**
* @ORM\ManyToOne(targetEntity="Vehicle",mappedBy="merchandise", cascade="{all}")
*/
级联可以设置为:
的组合通过向您的Vehicle实体添加级联(ORM级别)进一步改进。例如:
/**
* @ORM\OneToMany(targetEntity="Merchandise", mappedBy="verhicle", cascade="{persist,remove}")
*/
...或者使用带有
之一的onDelete(数据库级)......喜欢这个
/**
* @ORM\OneToMany(targetEntity="Merchandise", inversedBy="verhicle", onDelete="CASCADE")
*/
现在,如果您移除车辆 - 将删除相关的商品实体。添加的商品将自动保存。
...最后更新您的架构并放弃 - >如果尚未更新约束并发生错误,请重新创建数据库。确保双方都使用级联选项。
请阅读文档章节Transitive persistence / Cascade Operations中的更多内容。
答案 1 :(得分:0)
最后,当我尝试在DeleteController中删除它时,我解决了询问商品是否有车辆的问题。
如果商品推销与车辆相关联,我会返回表单错误而不删除实体;)