2017-03-07 3 views
1

Ich habe ein Problem mit UniqueEntity Validierung. Ich habe ein Feld "internal_asset_number", das eindeutig sein sollte und es funktioniert gut bei erstellen. Beim Update, wenn ich die vorhandenen aktuellen Daten mit den gleichen Werten bearbeite, wird "Es gibt bereits ein Asset mit dieser internen Nummer angezeigt!" aber es sollte nicht, weil es der gleiche Eintrag ist.Symfony 3 UniqueEntity Validierung auf Update

Das Unternehmen:

/** 
* 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; 

Methode Update:

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

Wie Sie tun das Update machen? Was meinst du mit "blockiert"? Welchen Fehler bekommst du? –

+0

@JakubMatczak Ich bekomme die Fehlermeldung, die ich gesetzt habe, wenn es dupliziert wird. Aber in diesem Fall aktualisiere ich denselben Eintrag mit den gleichen Werten, so dass es nicht passieren sollte. Ich habe meine Frage aktualisiert. – Cosmin

+1

Wenn es einen existierenden Eintrag in der Datenbank für die gegebenen Kriterien gibt, wird der 'UniqueEntityValidator' prüfen, ob das zu validierende Objekt und das gefundene Objekt identisch sind (d. H. Es führt eine Identitätsprüfung durch). Diese Überprüfung schlägt in Ihrem Fall fehl, da das zu validierende Objekt in Ihrem Fall das deserialisierte ist, aber nicht das von Doctrine verwaltete. – xabbuh

Antwort

1

Wie @xabbuh kommentiert, das Problem ist, dass das Objekt, das Sie bleiben auch nach Aktualisierung durch den EntityManager so nicht abgerufen wird, wenn Sie es anhalten Der Entity Manager denkt, dass es eine neue Entität ist.

Hier ist, wie es zu lösen:

$entityManager->merge($entity); 

Dies wird die EntityManager sagen Ihre serialisierten Einheit mit dem verwalteten ein

einige weitere Erklärung auf merge() fusionieren: https://stackoverflow.com/a/15838232/5758328