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

Foreign key and cascade problems on delete Symfony4/Doctrine

我想删除我的用户 属性,但出现以下错误:

使用参数 [1]:

执行 'DELETE FROM property WHERE id = ?' 时发生异常

SQLSTATE[23000]:违反完整性约束:1451 无法删除或更新父行:外键约束失败(gestImmo.equipment,CONSTRAINT FK_D338D583517FE9FE FOREIGN KEY ( equipment_id) 参考文献 property (id))

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

在我的用户实体中有:

     /**
     * @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;

在我的设备实体中有:

     /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Property", inversedBy="equipments")
     * @Assert\Type("string")
     * @var string
     */
    private $equipment;

感谢您的帮助!

您无法删除 属性,因为它在 table equipmentequipment_id 列中被引用。此外键约束意味着 equipment.equipment_id 必须指向 属性 - property.id 的有效(现有)ID。 如果您想删除 属性,那么在此之前您可以:

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

编辑

看起来你的注释不正确。如果我没看错你的关系,应该是这样的。

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;

在您的 manyToOne 注释中设置 onDelete="CASCADE" 就足够了。

之后别忘了bin/console make:migration。您在 ORM 中所做的所有更改都必须迁移才能将更改应用到数据库中。