Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 3-如何防止sql表重复行_Php_Mysql_Symfony_Symfony 3.2 - Fatal编程技术网

Php Symfony 3-如何防止sql表重复行

Php Symfony 3-如何防止sql表重复行,php,mysql,symfony,symfony-3.2,Php,Mysql,Symfony,Symfony 3.2,我正在Symfony3中创建API,我遇到了一个用户可以将游戏添加到堆栈中的情况。所以我有一个连接用户id和游戏id的表,但是当我向DB添加行时,可能会出现重复的情况,比如: 我想避免这种情况,但怎么做呢?是否有一些类似symfony3的方法可以防止这种情况?或者我应该在端点中添加一些if-else语句并返回一些JSON,并返回success:false?不管怎样,我怎么做?我正在寻找最简单或最有效的方法 实体的代码如下所示: <?php namespace AppBundle\Enti

我正在Symfony3中创建API,我遇到了一个用户可以将游戏添加到堆栈中的情况。所以我有一个连接用户id和游戏id的表,但是当我向DB添加行时,可能会出现重复的情况,比如:

我想避免这种情况,但怎么做呢?是否有一些类似symfony3的方法可以防止这种情况?或者我应该在端点中添加一些if-else语句并返回一些JSON,并返回success:false?不管怎样,我怎么做?我正在寻找最简单或最有效的方法

实体的代码如下所示:

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * @ORM\Table(name="games_on_stacks")
 */
class GamesOnStacks
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\ManyToOne(targetEntity="User")
     *
     */
    private $user;

    /**
     * @return mixed
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * @param mixed $user
     */
    public function setUser(User $user)
    {
        $this->user = $user;
    }

    /**
     * @ORM\ManyToOne(targetEntity="Game")
     */
    private $game;

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

    /**
     * @return mixed
     */
    public function getGame()
    {
        return $this->game;
    }

    /**
     * @param mixed $game
     */
    public function setGame($game)
    {
        $this->game = $game;
    }

}

uniquentity
约束添加到实体,并使用控制器中的验证对象:

AppBundle/Entity/GamesOnStacks.php

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * @ORM\Table(name="games_on_stacks")
 *
 * @UniqueEntity( fields={"user", "game"}, errorPath="game", message="This game is already added on this user stack.")
 */
class GamesOnStacks
{
...
}

uniquentity
约束添加到实体中,并使用控制器中的验证对象:

AppBundle/Entity/GamesOnStacks.php

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * @ORM\Table(name="games_on_stacks")
 *
 * @UniqueEntity( fields={"user", "game"}, errorPath="game", message="This game is already added on this user stack.")
 */
class GamesOnStacks
{
...
}

您可以查找现有的
GamesOnStacks
,并仅在没有时保存。另外,您可以设置一个@MateuszSip OK,但是如何设置呢?我尝试了:
@uniquentity(*fields={“user”,“game”},*errorPath=“game”,*message=“此游戏已添加到此用户堆栈中。”*)
添加到
@ORM\Table(name=“games\u on\u stacks”)
行下,但没有起作用。
@uniquentity
是另一回事,与。我提到的约束需要模式更新/迁移(这是值得做的)。您可以同时使用这两种方法(最好在应用程序和数据库级别引入这种验证),也可以用使用存储库方法的手动检查来替换
@uniquentity
(这更为明确,但如果正确实现,则工作原理相同)。symfony文档中记录了所有内容,因此请花些时间阅读,您应该可以轻松解决问题。您可以查找现有的
GamesOnStacks
,只有在没有时才保存。另外,您可以设置一个@MateuszSip OK,但是如何设置呢?我尝试了:
@uniquentity(*fields={“user”,“game”},*errorPath=“game”,*message=“此游戏已添加到此用户堆栈中。”*)
添加到
@ORM\Table(name=“games\u on\u stacks”)
行下,但没有起作用。
@uniquentity
是另一回事,与。我提到的约束需要模式更新/迁移(这是值得做的)。您可以同时使用这两种方法(最好在应用程序和数据库级别引入这种验证),也可以用使用存储库方法的手动检查来替换
@uniquentity
(这更为明确,但如果正确实现,则工作原理相同)。symfony文档中的所有内容都有很好的文档记录,所以请花些时间阅读,您应该可以轻松解决您的问题。谢谢!那正是我要找的我以这种方式创建了错误处理:
if(count($errors)>0){$errorsString='';foreach($errors as$error){$errorsString.=$error->getMessage();}$errArr=array('success'=>false,'error'=>$errorsString);返回新的JsonResponse(json_encode((数组)$errArr));}
谢谢!那正是我要找的我以这种方式创建了错误处理:
if(count($errors)>0){$errorsString='';foreach($errors as$error){$errorsString.=$error->getMessage();}$errArr=array('success'=>false,'error'=>$errorsString);返回新的JsonResponse(json_encode((数组)$errArr));}
/**
 * @Route("/game/{gameId}/add", name="game_add_to_stack")
 */
public function addToStack($gameId)
{
    $gameOnStack = new GamesOnStacks(); 
    // db apply
    $em = $this->getDoctrine()->getManager();
    $game = $em->getRepository('AppBundle:Game')
        ->findOneBy(['id' => $gameId]);
    $gameOnStack->setGame($game);
    $user = $em->getRepository('AppBundle:User')
        ->findOneBy(['id' => 1]);
    $gameOnStack->setUser($user);

    // validate using the validator service
    $validator = $this->get('validator');
    $errors = $validator->validate($gameOnStack);

    if (count($errors) > 0) {

        // custom error handling, e.g. returning failure jsonreponse, etc.
        $errorsString = (string) $errors;           

    } else {

        $em->persist($gameOnStack);
        $em->flush();
        $arr = array('success' => true);


        return new JsonResponse(json_encode((array)$arr));
    }

}