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



我知道这个主题有很多线程,我读了很多,但我还不知道如何解决我的问题。

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

应用程序:

/**
* @ORMEntity(repositoryClass=ApplicationRepository::class)
*/
class Application
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;

/**
* @ORMColumn(type="string", length=32, unique=true)
*/
private $name;
...
}

用户

/**
* @ORMEntity(repositoryClass=UserRepository::class)
*/
class User
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;

/**
* @ORMOneToOne(targetEntity=Application::class, cascade={"persist"}, fetch="EXTRA_LAZY")
* @ORMJoinColumn(nullable=false)
*/
private $application;
...
}

UserToken

/**
* @ORMEntity(repositoryClass=UserTokenRepository::class)
*/
class UserToken
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;

/**
* @ORMManyToOne(targetEntity=User::class, inversedBy="userTokens", cascade={"persist"}, fetch="EXTRA_LAZY")
* @ORMJoinColumn(nullable=false, onDelete="CASCADE")
*/
private $user;

/**
* @ORMOneToOne(targetEntity=Application::class, cascade={"persist"}, fetch="EXTRA_LAZY")
* @ORMJoinColumn(nullable=false)
*/
private $application;
...
}

当用户关闭会话(注销(时,我想删除UserToken表中的行,但不删除user表中的用户和application表中的应用程序,问题是总是说:

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={quot;persistent"}是php级别的,onDelete在DB级别。我也理解这个问题,但我不知道如何解决。

我能做什么?非常感谢。

重要信息:

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`)

UserToken

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
)

ENGINE=InnoDB

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

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

用户UserToken表中,它必须是:

/**
* @ORMManyToOne(targetEntity=Application::class, fetch="EXTRA_LAZY")
* @ORMJoinColumn(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总是说没有检测到任何更改。因此,我删除了模式,重新创建并验证了它,但没有任何更改。

在DEV环境中

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

相关内容

  • 没有找到相关文章

最新更新