关于删除Symfony4 / Doctrine的外键和级联问题

时间:2019-02-15 10:05:50

标签: php symfony doctrine-orm cascade

我想与用户一起删除属性,但是出现以下错误:

执行“ DELETE FROM属性WHERE id =吗?”时发生异常。带有参数[1]:

SQLSTATE [23000]:违反完整性约束:1451无法删除或更新父行:外键约束失败(gestImmoequipment,CONSTRAINT FK_D338D583517FE9FE外键({{ 1}})参考文献equipment_idproperty))

我用谷歌搜索,(我认为)这是一个级联问题。所以我在论坛上搜索,但没有解决问题。我向一个经过实验的同事寻求帮助,但我们没有解决错误……希望您能帮助我。

在我的用户实体中:

id

在我的实体Entity中:

     /**
     * @ORM\OneToMany(targetEntity="App\Entity\Property", mappedBy="userProperty")
     */
    private $properties;

在我的设备实体中:

     /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="properties")
     * @JoinColumn(name="id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $userProperty;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Equipment", mappedBy="equipment")
     * @JoinColumn(name="id", referencedColumnName="equipement_id", onDelete="CASCADE")
     */
    private $equipments;

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您无法删除属性,因为在表equipment_id的列equipment中引用了该属性。此外键约束意味着equipment.equipment_id必须指向属性property.id的有效(现有)id。 如果要删除属性,则在此之前,您可以:

  • 删除equipment记录其中equipment_id = {您要删除的属性的ID}
  • 或将那些equipment_id更改为空

编辑

看起来您的注释不正确。如果我正确理解了您的关系,那么应该是这样。

Property实体:

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="properties")
     * @JoinColumn(name="user_property_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $userProperty;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Equipment", mappedBy="equipment")
     */
    private $equipments;

Equipment实体:

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Property", inversedBy="equipments")
     * @ORM\JoinColumn(name="equipment_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $equipment;

答案 1 :(得分:0)

在manyToOne批注中设置onDelete="CASCADE"应该足够。

此后不要忘记bin/console make:migration。您必须迁移在 ORM 中所做的所有更改,才能将更改应用到数据库中。