Я знаю, что есть много тредов с этой темой, и я много их прочитал, но я пока не понимаю, как решить мою проблему.
У меня есть 3 таблицы, представленные следующими классами сущностей:
Приложение:
/**
* @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;
...
}
Токен пользователя
/**
* @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, но не удаляя пользователя в таблице пользователей и приложение в таблице приложений, проблема в том, что всегда говорится:
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-МарияДБ
Извините, это (важный) вывод таблицы создания шоу:
Пользователь:
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, не удаляя связанного пользователя и приложение.