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