Doctrine2 -不能删除具有单向oneToMany关系的实体


Doctrine2 - Cannot delete an entity with a unidirectional oneToMany relation

当试图删除包含单向一对多关联的实体时,我得到了一个外部约束违规。我有下面这个简单的类:

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`))'

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

如果我将关联更改为双向关联,它可以工作。为什么这对单向关联不起作用?

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

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

from here:

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

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


更新你的数据库模式之前抱怨它不工作:-)

app/console doctrine:schema:update --force

如果由于外键错误而无法工作,则按此顺序执行:

  • app/控制台学说:数据库:下降
  • app/控制台学说:数据库:创建
  • app/console原则:schema:update—force
  • (可选:app/console原则:fixtures:load)