更新时Symfony 3 UniqueEntity验证

时间:2017-03-07 15:35:07

标签: symfony

我遇到了UniqueEntity验证的问题。 我有一个字段" internal_asset_number"这应该是独一无二的,并且它在创建时工作正常。在我使用相同的值编辑现有当前数据时进行更新时,它显示"已存在具有该内部编号的资产!"但它不应该是因为它是相同的条目。

实体:

/**
* 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);
    }
    ...

1 个答案:

答案 0 :(得分:1)

正如@xabbuh评论的那样,问题是更新后持久存储的实体不是通过entityManager检索的,所以当你坚持它时,实体管理器会认为它是一个新的实体。

以下是解决方法:

$entityManager->merge($entity);

这将告诉实体经理将您的序列化实体与托管实体合并

关于merge()的更多解释: https://stackoverflow.com/a/15838232/5758328