Ошибка внешнего ключа при попытке удалить дочернюю строку

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

У меня есть 3 таблицы, представленные следующими классами сущностей:

Приложение:

     /**
     * @ORM\Entity(repositoryClass=ApplicationRepository::class)
     */
    class Application
    {
        /**
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type = "integer")
         */
        private $id;
    
        /**
         * @ORM\Column(type = "string", length=32, unique=true)
         */
        private $name;

        ...
    }

Пользователь

    /**
     * @ORM\Entity(repositoryClass=UserRepository::class)
     */
    class User
    {
        /**
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type = "integer")
         */
        private $id;
    
        /**
         * @ORM\OneToOne(targetEntity=Application::class, cascade = {"persist"}, fetch = "EXTRA_LAZY")
         * @ORM\JoinColumn(nullable=false)
         */
        private $application;

        ...
    }

Токен пользователя

    /**
     * @ORM\Entity(repositoryClass=UserTokenRepository::class)
     */
    class UserToken
    {
        /**
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type = "integer")
         */
        private $id;
    
        /**
         * @ORM\ManyToOne(targetEntity=User::class, inversedBy = "userTokens", cascade = {"persist"}, fetch = "EXTRA_LAZY")
         * @ORM\JoinColumn(nullable=false, onDelete = "CASCADE")
         */
        private $user;
    
        /**
         * @ORM\OneToOne(targetEntity=Application::class, cascade = {"persist"}, fetch = "EXTRA_LAZY")
         * @ORM\JoinColumn(nullable=false)
         */
        private $application;

        ...
    }

Когда пользователь закрывает сеанс (выход из системы), я хочу удалить строку в таблице UserToken, но не удаляя пользователя в таблице пользователей и приложение в таблице приложений, проблема в том, что всегда говорится:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (db`.`user`, CONSTRAINT `FK_8D93D649C6798DB` FOREIGN KEY (`application_id`) REFERENCES `application` (`id`))"

Я удаляю строку из UserToken следующим образом:

$em = $this->getDoctrine()->getManager();
$em->remove($userToken);
$em->flush();

Я пробовал много вещей, я знаю, что cascade = {"persist"} находится на уровне php, а onDelete - на уровне БД. И я тоже понимаю проблему, но я не знаю, как это исправить.

Что я могу сделать? Большое спасибо.

Важная информация:

Версия Symfony: 5.2.0

Версия доктрины: 2.7.1-DEV

Mysql: 10.1.40-МарияДБ

Редактировать:

Извините, это (важный) вывод таблицы создания шоу:

Пользователь:

 UNIQUE KEY `UNIQ_8D93D6493E030ACD` (`application_id`),
 CONSTRAINT `FK_8D93D649C6798DB` FOREIGN KEY (`application_id`) REFERENCES `application` (`id`)

Токен пользователя:

UNIQUE KEY `UNIQ_BDF55A633E030ACD` (`application_id`),
 KEY `IDX_BDF55A63A76ED395` (`user_id`),
 CONSTRAINT `FK_BDF55A633E030ACD` FOREIGN KEY (`application_id`) REFERENCES `application` (`id`),
 CONSTRAINT `FK_BDF55A63A76ED395` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
)

И ДВИГАТЕЛЬ=InnoDB

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если у кого-то еще есть эта проблема, я смог ее исправить.

Прежде всего, отношения между таблицами неверны.

В таблицах User и UserToken это должно быть:

    /**
     * @ORM\ManyToOne(targetEntity=Application::class, fetch = "EXTRA_LAZY")
     * @ORM\JoinColumn(nullable=false)
     */
    private $application;

Во-вторых, я почистил кеш доктрины:

php bin/console doctrine:cache:clear-metadata
php bin/console doctrine:cache:clear-query
php bin/console doctrine:cache:clear-result

После этого я попытался обновить свою схему (или создать новую миграцию), но symfony всегда говорит, что изменений не обнаружено. Поэтому я удаляю схему, воссоздаю ее и проверяю, но ничего не изменилось.

В среде разработки

php bin/console doctrine:schema:drop
php bin/console doctrine:schema:create
php bin/console doctrine:schema:validate

Чтобы изменения вступили в силу (в моем случае) самым важным было запустить команду:

php bin/console cache:clear

После этого symfony принял мои изменения, и я смог идеально обновить схему с помощью миграции.

Теперь я могу удалить UserToken, не удаляя связанного пользователя и приложение.

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