首页 > 解决方案 > 从 oneToMany 关系中删除一个项目。空值而不是删除

问题描述

我有这些实体

 class Centro {   
 /* ... */

 /**
 * @ORM\OneToMany(targetEntity=NivelesEscolares::class, mappedBy="centro", cascade={"persist", "remove"}, orphanRemoval=true)
 */
 private $nivelesEscolares;
 /* ... */
 }

Center 与 NivelesEscolares 实体链接到 OneToMany 关系。这是声明

 class NivelesEscolares
 {
 /*...*/

 /**
  * @ORM\ManyToOne(targetEntity=App\Entity\Centro::class, inversedBy="nivelesEscolares")
  */
 private $centro;

 }

当我删除一个中心时,应该删除学校级别,但它会变为空。我已经尝试过 orphanRemoval 但它仍然没有删除任何东西。也尝试使用 onDelete = "CASCADE" 但它不会删除任何内容。我需要 OneToMany 关系方面的帮助。

标签: phpsymfonydoctrine

解决方案


好吧 orphanRemoval 和 onDelete 有一些区别如下:

1.orphanRemoval="true"

  • 当拥有方实体是并且它不再连接到任何其他拥有方实体时,反向方的实体将被删除。不完全是,这使得教义表现得好像它不属于其他实体,因此将其删除。
  • ORM中的实现

2.onDelete="CASCADE"

  • 这会将 On Delete Cascade 添加到数据库中的外键列
  • 这个策略有点棘手,但可以very powerful and fast。(这是来自学说官方教程的引用......但没有看到更多解释)
  • ORM 要做的工作更少(与前两种方式相比),因此应该有更好的性能。如果您想在删除NivelesEscolares时删除Centro请使用onDeletenot orphanRemovallike this:应该如下所示:

    Centro
 class Centro {   
 /* ... */

 /**
 * @ORM\OneToMany(targetEntity=NivelesEscolares::class, mappedBy="centro", cascade={"persist", "remove"})
 */
 private $nivelesEscolares;
 /* ... */
 }

也可以onDelete这样NivelesEscolares使用@ORM\JoinColumn

 class NivelesEscolares
 {
 /*...*/

 /**
  * @ORM\ManyToOne(targetEntity=App\Entity\Centro::class, inversedBy="nivelesEscolares")
  * @ORM\JoinColumn(onDelete="CASCADE")
  */
 private $centro;

 }

正如您所说,这将迫使教义删除“学校级别”,享受吧!


推荐阅读