2017-03-07 69 views
1

我面临着UniqueEntity验证的问题。 我有一个字段“internal_asset_number”应该是唯一的,它在创建时工作正常。更新时,我编辑现有的当前数据具有相同的值,它显示“已经有一个资产与该内部号码!”但它不应该是因为它是相同的条目。Symfony 3更新中的UniqueEntity验证

实体:

/** 
* Asset 
* 
* @ORM\Table(schema="assets", name="asset", uniqueConstraints= {@ORM\UniqueConstraint(name="uk_asset_internal_asset_number_client_id", columns={"internal_asset_number", "client_id"})}) 
* @ORM\Entity(repositoryClass="Api\AssetBundle\Entity\AssetRepository") 
* @UniqueEntity(fields={"internalAssetNumber"}, groups={"post", "put"}, message="There is already an asset with that internal number!") 
*/ 
class Asset 
    { 
    /** 
    * @var guid 
    * 
    * @ORM\Column(name="id", type="string") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="UUID") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="client_id", type="string", length=255, nullable=false) 
    */ 
    private $clientId; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="internal_asset_number", type="string", length=255, nullable=true, unique=true) 
    */ 
    private $internalAssetNumber; 

更新方法:

public function putAssetAction(Request $request, $id) 
{ 
    $data = $this->deserializer('Api\AssetBundle\Entity\Asset', $request, 'put'); 
    if ($data instanceof \Exception) { 
     return View::create(['error' => $data->getMessage()], 400); 
    } 

    $validator = $this->get('validator'); 
    $errors = $validator->validate($data, null, 'put'); 

    if (count($errors) > 0) {   
     $errorsResponse = []; 
     foreach ($errors as $error) { 
      $errorsResponse = $error->getMessage(); 
     } 
     return View::create(array('error' => $errorsResponse), 400); 
    } 
    ... 
+0

你如何做更新?你是什​​么意思的“封锁”?你会得到什么错误? –

+0

@JakubMatczak我得到错误消息,我已经设置它重复时。但在这种情况下,我用相同的值更新相同的条目,所以它不应该发生。我更新了我的问题。 – Cosmin

+1

当给定条件的数据库中存在一个条目时,'UniqueEntityValidator'将检查被验证的对象和找到的对象是否相同(即它执行身份检查)。这种检查在你的情况下失败,因为在你的情况下被验证的对象是反序列化的对象,但不是由Doctrine管理的对象。 – xabbuh

回答

1

由于@xabbuh评论说,问题是,你坚持下去之后更新不通过的EntityManager检索到的实体,所以当你坚持它实体经理认为这是一个新的实体。

这里是如何解决这个问题:

​​

这将告诉EntityManager的上merge()与管理的一个

一些更多的解释合并您的序列化的实体: https://stackoverflow.com/a/15838232/5758328