У меня есть две сущности: сообщение и комментарии, где сообщение может иметь один или несколько комментариев.
Я реализовал каскад = {"remove"} в комментариях к посту OneToMany, который отлично работает!
Все комментарии, связанные с сообщениями, удаляются после подавления сообщений.
Затем я решил добавить атрибут topComment в мою запись (многие topComment в одну запись). После этого я попытался удалить сообщение с соответствующими комментариями, но подавление не удалось из-за ограничения внешнего ключа, даже если сообщение не имеет topComment ...
Вот ошибка, которую я получаю:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`lab_test_cascade_remove`.`comment`, CONSTRAINT `FK_9474526C4B89032C` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`))
Я избавился от этой ошибки, добавив аннотацию @JoinColumn(nullable=true)
к атрибуту topComment сообщения, но я нахожу это странным, потому что это стандартное поведение доктрины, если аннотация @JoinColumn не установлена ...
Может кто-нибудь объяснить мне, что происходит внутри, и вызвать эту ошибку, даже если в Посте нет topComment?
Большое спасибо заранее.
Вот мои сущности (только атрибуты):
Сообщение :
/**
* @ORM\Entity(repositoryClass="App\Repository\PostRepository")
*/
class Post
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Comment", mappedBy="post", cascade={"remove"})
*/
private $comments;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Comment")
*/
private $topComment;
Комментарий:
/**
* @ORM\Entity(repositoryClass="App\Repository\CommentRepository")
*/
class Comment
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Post", inversedBy="comments")
* @ORM\JoinColumn(nullable=false)
*/
private $post;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;