2017-03-07 85 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