2017-07-07 9 views
2

私は公開フィードを実装するプロジェクトに取り組んでいます。私はCommentエンティティを持っており、ユーザーは各フィードにコメントを投稿できます。しかし、私はユーザーがコメントへの回答を提出できるようにしたい。symfonyブログのネストされたコメントへのアクセス

私のCommentエンティティには、$responseというプロパティがあります。レスポンスはコメントでもあるので、レスポンスの保存はコメントを保存するのと同じであると思います。

しかし、私はidのないコメントにどのようにアクセスし、そのコメントに対する応答を保存するかについてはわかりません。

私のFeedController私はこのようにコメントを保存します。

$commentForm = $this->createForm(CommentType::class); 
    $commentForm->handleRequest($request); 
    if ($commentForm->isSubmitted() && $commentForm->isValid()) { 
     $content = $commentForm->get('content')->getData(); 
     $feed_id = $feed; 

     $comment= EntityBuilder::newComment($content, $user, $feed_id); 

     $commentService->saveEntity($comment); 

     if(!is_null($comment)){ 
      $this->addFlash(
       'commentsuccess', 
       'Your reply was successfully posted!' 
      ); 
     } 

     return $this->redirect($this->generateUrl('showFeed', array('slug' => $feed->getSlug()), UrlGeneratorInterface::ABSOLUTE_URL)); 

    } 

ここにコメントエンティティがあります。

/** 
* Class Comment 
* @package AppBundle\Entity 
* @ORM\Entity(repositoryClass="AppBundle\Repository\CommentRepository") 
* @ORM\Table(name="comment") 
* @ORM\HasLifecycleCallbacks() 
* 
*/ 
class Comment 
{ 

/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Feed", inversedBy="comments") 
* @ORM\JoinColumn(name="feedid", referencedColumnName="id") 
*/ 
private $feedid; 

/** 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="comments") 
* @ORM\JoinColumn(name="createdby", referencedColumnName="id") 
*/ 
private $createdby; 

/** 
* @ORM\Column(type="string") 
* @Assert\NotBlank(message="Please fill in the description") 
*/ 
private $content; 

/** 
* @ORM\OneToOne(targetEntity="Comment") 
*/ 
protected $response; 


/** 
* @ORM\Column(type="datetime") 
*/ 
private $createdAt; 

/** 
* @ORM\Column(type="datetime") 
*/ 
private $updatedAt; 


/** 
* Constructor 
*/ 
public function __construct() 
{ 
    $this->createdAt= new \DateTime(); 
    $this->updatedAt= new \DateTime(); 
} 

/** 
* Get id 
* 
* @return integer 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Set content 
* 
* @param string $content 
* 
* @return Comment 
*/ 
public function setContent($content) 
{ 
    $this->content = $content; 

    return $this; 
} 

/** 
* Get content 
* 
* @return string 
*/ 
public function getContent() 
{ 
    return $this->content; 
} 

/** 
* Set feedid 
* 
* @param \AppBundle\Entity\Feed $feedid 
* 
* @return Comment 
*/ 
public function setFeedid(\AppBundle\Entity\Feed $feedid = null) 
{ 
    $this->feedid = $feedid; 

    return $this; 
} 

/** 
* Get feedid 
* 
* @return \AppBundle\Entity\Feed 
*/ 
public function getFeedid() 
{ 
    return $this->feedid; 
} 

/** 
* Set createdby 
* 
* @param \AppBundle\Entity\User $createdby 
* 
* @return Comment 
*/ 
public function setCreatedby(\AppBundle\Entity\User $createdby = null) 
{ 
    $this->createdby = $createdby; 

    return $this; 
} 

/** 
* Get createdby 
* 
* @return \AppBundle\Entity\User 
*/ 
public function getCreatedby() 
{ 
    return $this->createdby; 
} 

/** 
* Set createdAt 
* 
* @param \DateTime $createdAt 
* 
* @return Comment 
*/ 
public function setCreatedAt($createdAt) 
{ 
    $this->createdAt = $createdAt; 

    return $this; 
} 

/** 
* Get createdAt 
* 
* @return \DateTime 
*/ 
public function getCreatedAt() 
{ 
    return $this->createdAt; 
} 

/** 
* Set updatedAt 
* 
* @param \DateTime $updatedAt 
* 
* @return Comment 
*/ 
public function setUpdatedAt($updatedAt) 
{ 
    $this->updatedAt = $updatedAt; 

    return $this; 
} 

/** 
* Get updatedAt 
* 
* @return \DateTime 
*/ 
public function getUpdatedAt() 
{ 
    return $this->updatedAt; 
} 


/** 
* Set response 
* 
* @param \AppBundle\Entity\Comment $response 
* 
* @return Comment 
*/ 
public function setResponse(\AppBundle\Entity\Comment $response = null) 
{ 
    $this->response = $response; 

    return $this; 
} 

/** 
* Get response 
* 
* @return \AppBundle\Entity\Comment 
*/ 
public function getResponse() 
{ 
    return $this->response; 
} 

}

私は応答のための別のフォームタイプを作成した場合でも、私はまだ、私は特定のコメントに対するレスポンスを保存する方法についてはよく分かりません。

+0

ここでツリー構造を実装する必要がありますか?これを見ているよりも - [doctrine extensions-tree](https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/tree.md) –

答えて

2

私recomendationはCommentエンティティとその反転 (OneToMany$childrenプロパティに(ManyToOne$parentフィールドを追加し、親/子供のアプローチを実装することです。後でフォームフィールドを$childrenプロパティのCommentTypeに追加することができます。したがって、コメントごとに複数の応答が必要な場合があります。

idについて心配しないでください。CollectionTypeがあなたのために機能します。 CollectionTypeの詳細については、hereをご覧ください。

+0

$ parent、$ childrenプロパティを作成し、CollectionTypeフォームを追加しました$ childrenのフィールド。その後、私は新しいコメントを追加し、データベースのparent_idフィールドをチェックしましたが、まだ空です。ここに私の書式があります。パブリック関数buildForm(FormBuilderInterface $ビルダー、配列$オプション) { $ビルダー - >( 'コンテンツ'、TextareaType ::クラス) を追加 - >を追加( '子供'、CollectionTypeは::クラス、配列( 「をby_reference '=> false )); } } – mburakergenc

+0

''allow_add' => true'も必要な場合があります。詳しくはリファレンスをチェックしてくださいhttp://symfony.com/doc/current/reference/forms/types/collection.html – yceruto

関連する問題