尝试删除子行时出现外键错误

Foreign Key error when I trying to delete a child row

我知道有很多关于这个主题的帖子,我也阅读了很多,但我还不知道如何解决我的问题。

我有 3 个 table 由以下实体表示 类:

申请:

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

        ...
    }

UserToken

    /**
     * @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 table 中的行但不删除用户 table 中的用户和应用程序 table 中的应用程序,问题是不是总是说:

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-MariaDB

编辑:

抱歉,这是 show create table:

的(重要)输出

用户:

 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

如果其他人有这个问题,我可以解决它。

首先表格之间的关系是错误的。

UserUserToken 表中,它必须是:

    /**
     * @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 而无需删除关联的用户和应用程序。