我知道这个主题有很多线程,我读了很多,但我还不知道如何解决我的问题。
我有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,而无需删除关联的用户和应用程序。