2016-10-30 58 views
0

我有一個表votecomment我會允許用戶只投一次comment_id。現在用戶可以多次投票評論。允許用戶只發一次評論[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

在你voteAction,檢查票已經不存在第一(與FIND) – Farkie

回答

0

基本上我只需要檢查當前用戶是否已經投票評論。

下面的我是如何做的一個例子:

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驗證約束你的投票實體。使用這種方式,您可以通過兩個字段($ user和$ votecomment)驗證您的實體唯一性。