如何从特定主题获取当前ID?

时间:2017-05-16 07:54:00

标签: php mysql symfony

我有一个主题论坛,其中每个主题都可以被其他用户评论。我创建的关系是:

class Comment
{
    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Topic", inversedBy="comments")
     */
    private $topic;
}

课堂主题:

class Topic
{
     /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Comment", mappedBy="topic")
     * @ORM\JoinColumn(name="comment_id", referencedColumnName="id")
     */
    private $comments;  
}

问题在于,当我创建注释时,comments表中的topic_id列为null。我不确定如何获取当前主题ID并将其设置为注释。这是我在 CommentController 中的 addCommentAction()函数

     /**
     * @Route("/comment/add", name="comment_add")
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function addCommentAction(Request $request)
    {
        $comment = new Comment();

        $form = $this->createForm(CommentType::class, $comment);
        $form->handleRequest($request);

        if ($form->isValid()) {

            $comment->setDateCreated(new \DateTime());

            $em = $this->getDoctrine()->getManager();
            $em->persist($comment);
            $em->flush();


            $this->addFlash(
                'notice',
                'Comment Added Successfully !'
            );
        }
        return $this->render('comments/comment.add.html.twig', array(
            'commentsForm' => $form->createView()
        ));
    }

树枝模板中的路径:

<a href="{{ path('comment_add') }}" class="btn btn-lg btn-default">Leave a Comment</a>

3 个答案:

答案 0 :(得分:1)

几乎完成:)只需尝试以下

如果主题已存在

$em = $this->getDoctrine()->getManager();
$topic = $em->getRepository('YouBundle:Topic')->find( $topic_id );

if(false === $topic instanceof topic )
{
 // not found ...
}

$comment = new Comment();
$comment->setTopic( $topic )
// createForm....

如果没有,而是在DB中查找一个

$topic = new Topic();
$comment = new Comment();
$comment->setTopic( $topic );

UPD:正如@Jakub Matczak所说。您可能需要在表单中添加一个带有topic_id的隐藏字段,因为您不希望获得包含所有可用主题的下拉列表。

buildForm方法

中的CommentForm类中
$builder->add('topic', HiddenType:class, []);

答案 1 :(得分:1)

您必须在评论实体上设置主题。在您的路由中,您必须添加主题的ID,然后Symfony将自动获取具有ParamConverter的主题实体

这样的事情应该有效:

/**
 * @Route("/{id}/comment/add", name="comment_add")
 * @param Request $request
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function addCommentAction(Request $request, Topic $topic)
{
    $comment = new Comment();
    $comment->setTopic($topic);

    $form = $this->createForm(CommentType::class, $comment);
    $form->handleRequest($request);

    if ($form->isValid()) {

        $comment->setDateCreated(new \DateTime());

        $em = $this->getDoctrine()->getManager();
        $em->persist($comment);
        $em->flush();


        $this->addFlash(
            'notice',
            'Comment Added Successfully !'
        );
    }
    return $this->render('comments/comment.add.html.twig', array(
        'commentsForm' => $form->createView()
    ));
}

答案 2 :(得分:0)

备注: $ form = $ this-&gt; createForm(CommentType :: class,$ comment); 不应该是“评论”?我在您的描述中没有看到任何CommentType类。

此外,您需要在添加新评论时以某种方式传递topicId。 我会为“/ comment / add”做一个POST动作,在主体中我会发送主题id。

//text()[contains(.,'keyword')]

除此之外,当您从客户端执行POST请求时,您还应该发送'topicId'。