我遇到了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);
}
...
UniqueEntityValidator
将检查正在验证的对象和找到的对象是否相同(即执行标识检查)。在您的情况下,此检查失败,因为正在验证的对象是反序列化的对象,而不是由 Doctrine 管理的对象。 - xabbuh