symfony2:如何使用doctrine / restrict注释删除相关实体?

时间:2013-06-07 09:58:46

标签: symfony orm annotations doctrine restrict

我对实体中的删除约束有些麻烦。

我有实体商品和实体车辆,商品中的商品数量多对一,因此商品只能在一辆车上,而车辆可能有很多商品。所以我有:

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,但它不起作用:(

有什么想法吗?

感谢!!!

2 个答案:

答案 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(数据库级)
  • SET NULL
  • CASCADE

......喜欢这个

/**
 * @ORM\OneToMany(targetEntity="Merchandise", inversedBy="verhicle", onDelete="CASCADE")
 */

现在,如果您移除车辆 - 将删除相关的商品实体。添加的商品将自动保存。

...最后更新您的架构并放弃 - >如果尚未更新约束并发生错误,请重新创建数据库。确保双方都使用级联选项。

请阅读文档章节Transitive persistence / Cascade Operations中的更多内容。

答案 1 :(得分:0)

最后,当我尝试在DeleteController中删除它时,我解决了询问商品是否有车辆的问题。

如果商品推销与车辆相关联,我会返回表单错误而不删除实体;)