2016-10-30 3 views
0

私はテーブルがありますvotecomment私はcomment_idのために1回だけ投票することを許可します。今のところ、ユーザーはコメントのために複数回投票することができます。コメントに1回だけ投票できるようにする[symfony2]

私は以前に、現在のuser_idがすでにcomment_idという投票に投票しているかどうかを確認するために、投票に投票するユーザーをテーブルに残したいと思います。

Controller.php

public function voteAction($id) 
{ 
    $em = $this->getDoctrine()->getEntityManager(); 
    $comment = $em->getRepository('ApplicationSonataUserBundle:Comment')->findOneBy(array('id' => $id)); 
    $entity = new Vote(); 
    $entity->setUser($this->get('security.token_storage')->getToken()->getUser()); 
    $entity->setVotecomment($comment); 
    $entity->setCreatedAt(new \DateTime()); 
    $em->persist($entity); 
    $em->flush(); 
    return $this->redirect($this->generateUrl('userShow', array(
    'entity' => $entity->getVotecomment()->getRecipient(), 
    'slug' => $entity->getVotecomment()->getRecipient()->getId(), 
     ))); 
} 

vote.php

<?php 

    namespace Application\Sonata\UserBundle\Entity; 
    use Doctrine\ORM\Mapping as ORM; 
    use Doctrine\Common\Collections\Collection; 
    use Symfony\Component\Validator\Constraints as Assert; 
    use Doctrine\Common\Collections\ArrayCollection; 

    /** 
    * @ORM\HasLifecycleCallbacks 
    * @ORM\Entity 
    * @ORM\Entity(repositoryClass="Application\Sonata\UserBundle\Entity\UserRepository") 
    * @ORM\Table(name="vote") 
    * 
    */ 

    class Vote 
    { 
     /** 
     * @ORM\Id 
     * @ORM\Column(type="integer") 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     protected $id; 


     /** 
     * @var User 
     * @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="likes") 
     */ 
     protected $user; 

     /** 
     * @var int 
     * 
     * @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\Comment", inversedBy="votes", cascade={"persist"}) 
     * @ORM\JoinColumn(name="votecomment_id", referencedColumnName="id") 
     * 
     */ 
     private $votecomment; 

     /** 
     * @ORM\Column(name="createdAt", type="datetime", nullable=false) 
     */ 
     protected $createdAt; 


     public function __construct() 
     { 
      $this->setCreatedAt(new \DateTime()); 

      $this->votecomment = new ArrayCollection(); 
     } 

} 

小枝ファイル

<a class="fa fa-thumbs-o-up" href="{{ path('likecomment', {'entity': entity ,'slug': entity.recipient.id ,'id': entity.id}) }}"></a><b class="text-color">&nbsp; &nbsp;{{ entity.votes|length }}</b> 
+0

、投票は既に(検索して)最初に存在していないことを確認 – Farkie

答えて

0

基本的には、現在のユーザーが既にコメントに投票しているかどうかを確認するだけでした。私はそれをやった方法の例を以下に

:あなたのvoteActionで

public function voteAction(Request $request,$id) 
    { 
     $em = $this->getDoctrine()->getEntityManager(); 


     $comment = $em->getRepository('ApplicationSonataUserBundle:Comment')->findOneBy(array('id' => $id)); 
     $voteExist = $em->getRepository('ApplicationSonataUserBundle:Vote')->findOneBy([ 
      'user' => $this->getUser(), 
      'votecomment' => $comment 
     ]); 
     $vote = new Vote(); 
     if(!$voteExist) { 

      $vote->setUser($this->get('security.token_storage')->getToken()->getUser()); 
      $vote->setVotecomment($comment); 
      $vote->setCreatedAt(new \DateTime()); 
      $em->persist($vote); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('userShow', array(
       'entity' => $vote->getVotecomment()->getRecipient(), 
       'slug' => $vote->getVotecomment()->getRecipient()->getId(), 
      ))); 



     } else { 

      $em->remove($voteExist); 
      $em->flush(); 
      //$this->get('session')->getFlashBag()->add('notice', 'You have already voted!'); 

     } 

     return $this->redirect($this->generateUrl('userShow', array(
      'entity' => $comment->getRecipient(), 
      'slug' => $comment->getRecipient()->getId(), 
     ))); 

    } 
0

もちろん を、このソリューションを試してみてください、あなたはコメントリポジトリ上のカスタムメソッドを作成することにより、$ hasVoteを作成することができます。

public function voteAction($id) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $hasVote = $em 
     ->getRepository('ApplicationSonataUserBundle:Comment') 
     ->find(array(
      'id' => $id, 
      'user' => $this->getUser()) 
     ); 

    if ($hasVote){ 

     // Add flash - already voted 
     // Redirect to route... 
    } else { 

     $comment = $em 
     ->getRepository('ApplicationSonataUserBundle:Comment') 
     ->findOneBy(array('id' => $id)); 

     $vote = new Vote(); 
     $vote->setUser($this->getUser()); 
     $vote->setVotecomment($comment); 
     $vote->setCreatedAt(new \DateTime()); 

     $em->persist($vote); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('userShow', array('entity' => $entity->getVotecomment()->getRecipient(),'slug' => $entity->getVotecomment()->getRecipient()->getId(),))); 
    } 
} 
1

私はSymfony Validation componentを使用して、あなたの投票エンティティにUniqueEntity検証制約を追加することをお勧めします。この方法で、エンティティの一意性を2つのフィールド($ userと$ votecomment)で検証することができます。

関連する問題