尝试删除子行时出现外键错误
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
如果其他人有这个问题,我可以解决它。
首先表格之间的关系是错误的。
在 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 而无需删除关联的用户和应用程序。
我知道有很多关于这个主题的帖子,我也阅读了很多,但我还不知道如何解决我的问题。
我有 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
如果其他人有这个问题,我可以解决它。
首先表格之间的关系是错误的。
在 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 而无需删除关联的用户和应用程序。