删除时的外键和级联问题 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 equipment
的 equipment_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 中所做的所有更改都必须迁移才能将更改应用到数据库中。
我想删除我的用户 属性,但出现以下错误:
使用参数 [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 equipment
的 equipment_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 中所做的所有更改都必须迁移才能将更改应用到数据库中。