php - Doctrine2 - 无法删除具有单向 oneToMany 关系的实体

标签 php orm doctrine-orm

在尝试删除包含单向一对多关联的实体时,我遇到了外部约束冲突。我有以下简单的类:

class Dealer{

/**
 * @ManyToMany(targetEntity="Car", cascade={"persist", "remove"})
 * @JoinTable(name="dealer_cars",
 *      joinColumns={@JoinColumn(name="dealer_id", referencedColumnName="id")},
 *      inverseJoinColumns={@JoinColumn(name="car_id", referencedColumnName="id",
        unique=true)}
 *    )
 **/
  protected cars;
}

在这种情况下,Car 对象不应包含与其所有者的关系(因此是单向关系)。如果我尝试删除包含与汽车关联的 Dealer 对象,我会遇到以下约束冲突:

Cannot delete or update a parent row: a foreign key constraint fails 
(`application`.`dealer_cars`, CONSTRAINT `FK_E1BCEEEBC3C6F69F`
 FOREIGN KEY (`car_id`) REFERENCES `car` (`id`))'

如果我尝试从数据库表中手动删除经销商行,我会收到相同的消息,但我认为使用 cascade="remove"的 Doctrine 会为我解决这个问题。

如果我将关联更改为双向关联,它就会起作用。为什么这不适用于单向关联?

最佳答案

在 Doctrine 中使用数据库级别的 onDelete 选项

@ORM\JoinColumn(name="dealer_id", referencedColumnName="id",  onDelete="SET NULL")

来自 here 的解释:

  • CASCADE 将在父级更改时传播更改。 (如果删除一行,则引用该行的约束表中的行也将被删除,等等)
  • SET NULL 在父行消失时将列值设置为 NULL。

  • RESTRICT 导致父行的 DELETE 尝试失败。


...更新您的数据库模式,然后再提示它不起作用:-)

app/console doctrine:schema:update --force

如果由于外键错误而无法正常工作(按此顺序):

  • app/console doctrine:database:drop
  • 应用程序/控制台原则:数据库:创建
  • app/console doctrine:schema:update --force
  • (可选:app/console doctrine:fixtures:load)

关于php - Doctrine2 - 无法删除具有单向 oneToMany 关系的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16780995/

相关文章:

.net - NHibernate 的产品发布

javascript - 如何在 Laravel 中使用 React Router?

php - Angular 应用程序不调用 php

php - 将 Ubuntu 时钟源从 xen 切换到 tsc 会影响 php/Laravel 应用程序吗?

java - 如何设置@Column注释使用的精度属性?

hibernate - 在 embeddable/embedded-id 中使用 hibernate 序列生成器

php - 服务层的数据访问和安全(Doctrine & ZF)

php - 检查 Doctrine2 中是否存在关系的技术

php - Doctrine2.3 和 OneToOne 级联持久化似乎不起作用

php - Symfony 2 : Doctrine Cache Namespace