8

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

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 会为我解决这个问题。

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

4

1 回答 1

17

将数据库级别的 onDelete 选项与 Doctrine 一起使用

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

来自这里的解释:

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

  • RESTRICT 导致尝试删除父行失败。


...在抱怨它不起作用之前更新您的数据库模式:-)

app/console doctrine:schema:update --force

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

  • 应用程序/控制台原则:数据库:drop
  • 应用程序/控制台原则:数据库:创建
  • 应用程序/控制台原则:架构:更新 --force
  • (可选:应用程序/控制台原则:fixtures:load)
于 2013-05-28T00:24:09.680 回答