2017-03-07 24 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; 

アップデート方法:コメント@xabbuhとして

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

、問題は、あなたがそれを永続化するときに、更新後も持続エンティティがそのようにはEntityManagerを通じて取得されていないということですエンティティマネージャはそれが新しいエンティティであると考えます。ここで

は、それを解決する方法である:

​​

これはmerge()上のいくつかの詳細な説明管理される1つ

であなたのシリアル化されたエンティティをマージするEntityManagerを教えてくれます: https://stackoverflow.com/a/15838232/5758328

関連する問題