Поведение доктрины с помощью cascade = {"remove"} в отношении OneToMany с ManyToOne к той же сущности - PullRequest
0 голосов
/ 14 мая 2019

У меня есть две сущности: сообщение и комментарии, где сообщение может иметь один или несколько комментариев.

Я реализовал каскад = {"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;
...