Как сохранить сущность, связанную с уже существующей? - PullRequest
0 голосов
/ 10 октября 2018

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

В моем случае пост и пользователь уже существуют , а не комментарий.

Классы выглядят так: enter image description here

Мой вопрос заключается в следующем: с этимкакая-то сложная схема, какая сущность должна сохраняться / объединяться и в каком порядке при сохранении комментария к существующему сообщению существующим пользователем?

Мне не нужен код, просто объяснение того, как он работает,вот почему я не включаю код.Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вам просто нужно установить Author и Post, а затем persist новый комментарий:

$comment->setAuthor($yourAuthor)
        ->setPost($yourPost);
$em->persist($comment);
$em->flush();

Здесь я не обратил слишком много внимания на Ответы [], потому что выне объяснил отношения.Однако, если Answer является другим Comment и если Comment может быть Answer только для другого Comment, то вам может потребоваться добавить поле Replied, которое будет Comment и по существувнешний ключ, так что все комментарии внутри Ответы [] будут иметь поле «Ответ», то есть Comment, чей ответ «[] содержит другой Comment.

0 голосов
/ 10 октября 2018

Каскадирование на самом деле не поможет вам в этом случае, так как я представляю, что у вас есть отдельная (не встроенная) форма CommentType.Таким образом, вы получаете объект Comment в вашем контроллере, который вы должны сохранить, связанный с уже существующими объектами User и Post.

Каскадирование было бы полезно, если бы у вас была форма PostType, например, со встроенной формой CommentType (через поле comment), и вы хотели сохранить (или обновить) как Post, так иComment сущность.

Я бы предложил добавить поле post_id в форму CommentType и использовать DataTransformer, например, документация Symfony предлагает здесь для преобразования post_id вPost сущность.Наконец, все, что вам нужно сделать, это явно указать своего пользователя в контроллере:

...
$comment = new Comment();
$form = $this->createForm(CommentType::class, $comment);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
    $comment->setUser($this->getUser());
    $em->persist($comment);
    $em->flush();
}
...