Symfony Сохранение комментариев в блоге с пользователем и идентификатором блога

Я использую symfony 2.8, я создал отношения «один ко многим» между пользователем и блогом (один пользователь — много блогов). Также я создал связь «один ко многим» между блогом и комментариями. Точно так же отношение «один ко многим» между пользователем и комментариями. Теперь моя таблица комментариев выглядит так

таблица комментариев

id  Primary     int(11) 
user_id  Primary    int(11)
blog_id  Primary    int(11) 
comment             varchar(2000)  
created_at          datetime

Объект комментария

Комментарий

Блог

Блог

Объект пользователя

Объект пользователя

Контроллер блога -> метод ShowAction

/**
 * @Route("/blog/show/{id}", name="blog_show")
 */
public function showAction(Request $request,$id)
{
    $blog = $this->getDoctrine()->getRepository(Blog::class)->findOneById($id);
    $comment = new Comment();
    $form = $this->createForm(CommentType::class, $comment);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $user = new User();
        $blog = new Blog();
        $comment->setUser($this->getUser());
        $comment->setBlog($blog);
        $em = $this->getDoctrine()->getManager();
        $em->persist($comment);
        $em->flush();
        return $this->redirect($this->generateUrl('blog_show', array('id' => $id)), 301);
    }

    return $this->render('Blog/show.html.twig', array('blog'=> $blog,'form' => $form->createView()));

}

Теперь, когда я отправляю форму комментария со страницы показа блога, она показывает мне эту ошибку

"A new entity was found through the relationship 'AppBundle\Entity\Comment#blog' that was not configured to cascade persist operations for entity: AppBundle\Entity\Blog@0000000017546b06000000001fededdf. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement 'AppBundle\Entity\Blog#__toString()' to get a clue."

Что я пропустил здесь. Буду признателен за любую оказанную помощь. Спасибо


person Aamir    schedule 27.09.2017    source источник
comment
Он говорит вам, что в классе нет функции с именем getBlog. Это правда?   -  person Ben Hillier    schedule 27.09.2017
comment
Если вы проверите сущность моего комментария, то увидите, что определена одна функция getBlog(). Но все равно показывает эту ошибку.   -  person Aamir    schedule 27.09.2017
comment
Но это в сущности Comment. Когда вы вызываете $this->getBlog();, он ищет эту функцию в самом BlogController. Вам нужно получить его из формы вместо этого?   -  person Ben Hillier    schedule 27.09.2017
comment
О, хорошо. Итак, как я могу получить метод getBlog() из моего объекта Comment, я имею в виду, что он должен получить текущий блог, в котором пользователь отправил комментарий.   -  person Aamir    schedule 27.09.2017
comment
Пользователь выбирает эти значения в форме? Я думаю, вам нужно проверить эту страницу: symfony.com/doc/2.8/forms.html< /а>   -  person Ben Hillier    schedule 27.09.2017
comment
Также эти строки создают новые пустые объекты, которые затем ничего не делают. ` $user = новый пользователь(); $блог = новый блог();`. Я не думаю, что это может быть вашим намерением.   -  person Ben Hillier    schedule 27.09.2017
comment
Да, он создает новые пустые объекты, я хочу сохранить $blogId, используя отношения. Так что я немного смущен, так как комментарий связан как с пользователем, так и с блогом.   -  person Aamir    schedule 27.09.2017
comment
Для этого вы должны получить существующий блог и пользователя.   -  person svgrafov    schedule 27.09.2017
comment
Я отредактировал метод showAction(). Смотрите первую строку сейчас. Это объект существующего блога. Теперь, когда я отправляю форму комментария, она показывает мне эту ошибку. Я опубликовал новую ошибку в вопросе.   -  person Aamir    schedule 27.09.2017


Ответы (1)


Я не вижу в вашем коде переменной с именем $blogId, но если она установлена, вы можете попробовать:

[Редактировать: следуйте вашему примеру, чтобы получить $blog]

$blog = $this->getDoctrine()->getRepository(Blog::class)->findOneById($id);

$comment->setBlog($blog);//Pass that entity to the CommentEntity
person Ben Hillier    schedule 27.09.2017
comment
теперь он показывает мне эту ошибку. Через отношение «AppBundle\Entity\Comment#blog» был найден новый объект, который не был настроен для каскадных операций сохранения для объекта: AppBundle\Entity\Blog@000000000e6df9e9000000000ffb3b56. Чтобы решить эту проблему: либо явно вызовите EntityManager#persist() для этого неизвестного объекта, либо настройте каскадное сохранение этой ассоциации в сопоставлении, например, @ManyToOne(..,cascade={persist}). Если вы не можете выяснить, какой объект вызывает проблему, реализуйте «AppBundle\Entity\Blog#__toString()», чтобы получить подсказку. - person Aamir; 27.09.2017
comment
Эта строка переопределяла объект $blog $blog = new Blog(); в методе показательных выступлений. Я удалил его, и он работал отлично. - person Aamir; 27.09.2017
comment
Большой! Удачи! - person Ben Hillier; 27.09.2017