繁体   English   中英

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

[英]Foreign key and cascade problems on delete Symfony4/Doctrine

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

执行“DELETE FROM property WHERE id = ?”时发生异常使用参数 [1]:

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

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

在我的用户实体中有:

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

谢谢你的帮助 !

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

  • 删除equipment记录 where equipment_id = {id of property you want to delete}
  • 或者将那些equipment_id 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 中更改的所有内容都必须迁移,以便将更改应用到数据库中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM