Проблемы с внешним ключом и каскадом при удалении Symfony4/Doctrine

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

Возникло исключение при выполнении «УДАЛИТЬ ИЗ свойства, ГДЕ id =?» с параметрами [1]:

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

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

В моем пользовательском объекте есть:

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

В моем свойстве Entity есть:

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
3 297
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не можете удалить свойство, потому что оно указано в столбце equipment_id в таблице equipment. Это ограничение внешнего ключа означает, что equipment.equipment_id должен указывать на действительный (существующий) идентификатор свойства — property.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;

Установки onDelete = "CASCADE" в аннотации manyToOne должно быть достаточно.

Не забудьте bin/console make:migration после этого. Все, что вы изменяете в своем ОРМ, должно быть перенесено, чтобы применить изменения в базе данных.

Другие вопросы по теме