Невозможно сохранить глубоко вложенную сущность с недавно созданными отношениями (Доктрина) - PullRequest
0 голосов
/ 14 октября 2019

У меня есть одна сущность "Пользователь", и у нее есть другие отношения: "сообщения" и под "сообщениями". У меня есть другое отношение, называемое "комментарии".

Теперь я хочу, чтобы пользователь мог публиковать сообщения вконечная точка выглядит так:

{
  "name" : "John Doe",
  "posts" : [
   {
     "Title" : "Main post",
     "comments" : [
       {
          "body" : "Love this post!"
       }
     ]
   } 
  ]
}

и, следовательно, позволяют сделать все объекты за один вызов. Дело в том, что все работает достаточно глубоко, до такой степени, что мы должны сохранить часть комментариев.

Я уже пробовал следующее: в модели User я установил «postComments» с помощью следующего конструктора аннотаций.

class User {
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Posts", mappedBy="comments", cascade={"persist", "remove"})
     */
    private $postComments;

    public function __construct()
    {
        $this->postComments = new ArrayCollection();
    }
}

class Post {
     /**
      * @ORM\OneToMany(targetEntity="App\Entity\Comment", mappedBy="post", cascade={"persist","remove"})
      *
      * @Assert\Valid
      */
    private $comments;
}

И в репозитории я попробовал это:


  foreach ($comments as $comment) {
            $newComment = $this->commentRepository->create($post,$comment);
            $post->getComments()->add($newComment);
        }

И я попробовал

$post->setComments($newCommentsArray)

Все выдало те же проблемы, что и конечно. Идентификатор "сообщения" еще не создан, и, следовательно, связь не может быть установлена, но как мы можемрешить и сделать это с Doctrine?

Или есть ограничение

Это вместе создаст следующую проблему:

App\Entity\Comments is missing an assigned ID for field 'postId'. The identifier generation strategy for this entity requires the ID field to be populated before EntityManager#persist() is called. If you want automatically generated identifiers instead you need to adjust the metadata mapping accordingly.
...