Проблемы с внешним ключом и каскадом при удалении Symfony4 / Doctrine - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу удалить свойство с моим пользователем, но у меня появляется следующая ошибка:

Исключительная ситуация при выполнении операции "УДАЛИТЬ ИЗ свойства WHERE id =?"с параметрами [1]:

SQLSTATE [23000]: нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется (gestImmo. equipment, CONSTRAINT FK_D338D583517FE9FE FOREIGN KEY(equipment_id) ССЫЛКИ property (id))

Я погуглил это и (я думаю) это проблема каскада.Поэтому я искал на форумах, но не решил проблему.Я попросил помощи у опытного сотрудника, но мы не исправили ошибку ... Надеюсь, вы могли бы помочь мне.

В моей сущности User есть:

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

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 15 февраля 2019

Вы не можете удалить свойство, так как оно указано в столбце equipment_id в таблице equipment.Это ограничение внешнего ключа означает, что equipment.equipment_id должен указывать на действительный (существующий) идентификатор свойства - property.id.Если вы хотите удалить свойство, то перед этим вы либо:

  • удалите equipment записи, где equipment_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;
...