Sei que há muitos tópicos com esse tópico e li muitos deles, mas ainda não entendo como resolver meu problema.
Tenho 3 tabelas representadas pelas seguintes classes de entidades:
Inscrição:
/**
* @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;
...
}
Do utilizador
/**
* @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;
...
}
Quando um usuário fecha a sessão (logout) eu quero excluir a linha na tabela UserToken, mas sem remover o usuário na tabela User e o aplicativo na tabela Application, o problema é que sempre diz:
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`))"
Eu removo a linha do UserToken da seguinte forma:
$em = $this->getDoctrine()->getManager();
$em->remove($userToken);
$em->flush();
Eu tentei muitas coisas, eu sei que cascade = {"persist"} está no nível php e onDelete está no nível do banco de dados. E também entendo o problema, mas não sei como resolver.
O que eu posso fazer? Muito obrigado.
Informação importante:
Versão Symfony: 5.2.0
Versão do Doctrine: 2.7.1-DEV
Mysql: 10.1.40-MariaDB
Desculpe, esta é a saída (importante) de show create table:
Usuário :
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
)
E o ENGINE = InnoDB
Se outra pessoa tiver esse problema, eu consegui corrigi-lo.
Em primeiro lugar, a relação entre as tabelas está errada.
Nas tabelas User e UserToken , deve ser:
/**
* @ORM\ManyToOne(targetEntity=Application::class, fetch="EXTRA_LAZY")
* @ORM\JoinColumn(nullable=false)
*/
private $application;
Em segundo lugar, limpei o cache de doutrina:
php bin/console doctrine:cache:clear-metadata
php bin/console doctrine:cache:clear-query
php bin/console doctrine:cache:clear-result
Depois disso, tentei atualizar meu esquema (ou criar uma nova migração), mas o symfony sempre diz que nenhuma alteração foi detectada. Então eu removo o esquema, recrio-o e valido, mas nada mudou.
Em ambiente DEV
php bin/console doctrine:schema:drop
php bin/console doctrine:schema:create
php bin/console doctrine:schema:validate
Para efetivar as mudanças (no meu caso) o mais importante era executar o comando :
php bin/console cache:clear
Depois disso, o symfony aceitou minhas alterações e fui capaz de atualizar o esquema com uma migração perfeitamente.
Agora posso remover um UserToken sem remover o usuário e o aplicativo associados.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras