相关疑难解决方法(0)

cascade = {"remove"} VS orphanRemoval = true VS ondelete ="CASCADE

我尝试收集有关以下方式的一些信息,以便在删除父实体时自动删除子实体.似乎最常见的方法是使用这三个注释:cascade = {"remove"} OR orphanRemoval = true OR ondelete ="CASCADE".

对第三个问题感到有点困惑:ondelete ="CASCADE",正如关于这个的官方文档中的解释非常稀缺)如果有人能够证实我从我的研究中收集和了解的以下信息,我会很高兴.网和经验......

它能做什么

cascade = {"remove"}
==>当拥有方实体为时,删除反面的实体.即使你与其他拥有的实体有许多不同之处.
- 应该用于集合(所以在OneToMany或ManyToMany关系中)
- 在ORM中实现

orphanRemoval = true
==>当拥有方实体为AND时,将删除反方的实体,并且它不再连接到任何其他拥有方实体.(参考 doctrine official_doc - ORM中的实现
- 可以与OneToOne,OnetoMany或ManyToMany一起使用

onDelete ="CASCADE"
==>这会将删除级联添加到数据库中的外键列
- 这个策略有点难以实现,但可以非常强大和快速.(参见 doctrine official_doc ......但还没有阅读更多解释)
- ORM必须做的工作少(与之前的两种做法相比),因此应该有更好的表现.

其他信息
- 所有这三种方式都在双向关系实体实现(右???)
- 使用cascade = {"remove"}完全绕过任何外键onDelete = CASCADE.(参见doctrine_official_doc)

关于如何在代码中使用它的示例

  • orphanRemoval和cascade = {"remove"}在反转的实体类中定义.
  • ondelete ="CASCADE"在所有者实体中定义
  • 你也可以写@ORM\JoinColumn(onDelete ="CASCADE")并让doctrine处理列名

级联= { "去除"}

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", …
Run Code Online (Sandbox Code Playgroud)

entity doctrine cascade symfony

89
推荐指数
1
解决办法
3万
查看次数

Doctrine 2 OneToMany Cascade SET NULL

错误

无法删除或更新父行:外键约束失败.

课程

class Teacher {

    /**
     *@ORM\OneToMany(targetEntity="publication", mappedBy="teacher")
     */
    protected $publications;
}

class Publication {

    /**
     * @ORM\ManyToOne(targetEntity="Teacher", inversedBy="publications")
     * @ORM\JoinColumn(name="teacher_id", referencedColumnName="id")
     */
    protected $teacher;
}
Run Code Online (Sandbox Code Playgroud)

我想要

我想要的是,当你删除教师时,id_teacher被修改为NULL.我想保留出版物但不参考教授.

我不知道在Doctrine中是怎么做的,这可能吗?或者总是与老师的关系?

null doctrine set one-to-many

53
推荐指数
2
解决办法
4万
查看次数

删除级联中的实体不能在ManyToMany关系中工作

我有一个父实体类别和一个子实体文章.它们由ManyToMany关系定义.一篇文章可以在一个或多个类别中进行分类,每个类别可以在多个文章中进行标记.

我想做什么我
希望当我删除一个类别时,类别中标记的每个文章也被删除但是只有当它们没有被其他类别标记时.

我已经测试了什么我
测试了2类(id = 1和id = 2)和两篇文章(id = 71和id = 91).第71条同时具有第1类和第2类.第91条仅与第2类相关联.
因此,在删除第2 类时,我希望删除第91条而不删除第71条(因为这一条仍然与第1类相关)

但是,无论我尝试过什么,这都不会发生......

下面的图片中,我总结了使用不同策略得到的结果(1/cascade = {"remove"},2/orphanRemoval = true和3/ondelete ="CASCADE").
绿色从数据库中删除.

在此输入图像描述

我的代码(部分代码)

在控制器中

public function deleteCategory(Category $category)
{
  $em = $this->getDoctrine()->getManager();
  $em->remove($category);
  $em->flush();
}
Run Code Online (Sandbox Code Playgroud)

for strategy 1/cascade = {"remove"}

 // IN CLASS/ENTITY CATEGORY - OWNER OF THE RELATION
 * @ORM\ManyToMany(targetEntity="Article", inversedBy="categories",  cascade={ "remove"})
 private $articles;

 // IN CLASS/ENTITY ARTICLE 
 * @ORM\ManyToMany(targetEntity="Category", mappedBy="articles")
 private $categories;
Run Code Online (Sandbox Code Playgroud)

对于策略2/orphanRemoval = true

 // IN CLASS/ENTITY CATEGORY - OWNER …
Run Code Online (Sandbox Code Playgroud)

php mysql doctrine symfony

6
推荐指数
1
解决办法
563
查看次数

标签 统计

doctrine ×3

symfony ×2

cascade ×1

entity ×1

mysql ×1

null ×1

one-to-many ×1

php ×1

set ×1