1

我在实体中的删除约束方面遇到了一些麻烦。

我有一个实体商品和一个实体车辆,在商品中具有多对一的关系,所以一个商品只能在一个车辆中,而一个车辆可以有很多商品。所以我有:

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 级别限制约束。我尝试了 restrict={"remove"} 但它在 @ORM\OneToMany 中不存在。我还尝试放置一个返回 false 的 preRemove 函数,但它不起作用:(

任何想法?

谢谢!!!

4

1 回答 1

4

从学说的角度来看,ManyToOne / inversedBy 是双向关系的 OWNING 方面 - 这可能会导致混淆。

要解决您的问题,请将级联操作添加到您的商品实体。例子:

/**
 * @ORM\ManyToOne(targetEntity="Vehicle",mappedBy="merchandise", cascade={"all"})
 */

级联可以设置为以下组合:

  • 坚持
  • 消除
  • 合并
  • 分离
  • 全部

通过向您的 Vehicle 实体添加级联(ORM 级别)进一步改进。例子:

/**
 * @ORM\OneToMany(targetEntity="Merchandise", mappedBy="vehicle", cascade={"persist","remove"})
 */

...或将 onDelete (数据库级别)与其中之一一起使用

  • 设置为空
  • 级联

... 像这样

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

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

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

阅读文档章节Transitive persistence / Cascade Operations了解更多信息。

于 2013-06-08T04:41:12.363 回答