2 Stimmen

Symfony2: Entität abrufen und ändern ==> SQLSTATE[23000]: Integritätseinschränkungsverletzung: 1062 Duplizierter Eintrag '1-170' für Schlüssel 'PRIMARY'

Ich habe eine Entität und würde gerne einige Werte ändern.

Also

  1. Ich rufe meine Entität ab
  2. Ich ändere Werte
  3. Ich bleibe bei meiner Entität und spüle

... Aber ich habe diesen Fehler:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-170' for key 'PRIMARY' 

Hier der Code

/**
 *
 * @ORM\Table(name="entity")
 * @ORM\Entity(repositoryClass="App\Bundle\Entity\EntityRepository")
 * @ORM\OrderBy({"date" = "ASC"})
 */
class Entity
{
      /**
      * @var integer $id
      *
      * @ORM\Column(name="id", type="integer")
      * @ORM\Id
      * @ORM\GeneratedValue(strategy="AUTO")
      */
     private $id; 
     // ...
}

Ich rufe meine Entität auf diese Weise ab:

function get(){
       $query = $repository->createQueryBuilder('E')
        ->select ('E')          
            ->where('(E.type=:type) AND (E.m = :id)')
            ->setParameter('type',  $pType)
            ->setParameter('id',  $pMediaId)
        ->getQuery();
        return $query->getResult();
 }

Und beharrlich

$entity = $this->em->get(); // I have the correct value
entity->setTitle('My new title');
$this->em->persist($entity);

$this->em->flush();

Bitte helfen Sie mir

Tschüss

Sam

2voto

chasen Punkte 456

Sie brauchen die Entität nicht aufrechtzuerhalten. Sie müssen nur die Änderungen spülen, während die Aufrechterhaltung versucht, einen neuen Datensatz zu erstellen.

EDITAR:

Direkt aus der SF2-Dokumentation:

http://symfony.com/doc/current/book/doctrine.html

Die Aktualisierung eines Objekts umfasst nur drei Schritte:

  1. Holen des Objekts aus Doctrine;
  2. das Objekt zu ändern;
  3. Aufruf von flush() für den Entity Manager

Beachten Sie, dass der Aufruf von $em->persist($product) nicht notwendig ist. Erinnern Sie sich daran, dass diese Methode Doctrine lediglich anweist, das $product-Objekt zu verwalten oder zu "beobachten". Da Sie in diesem Fall das $product-Objekt von Doctrine geholt haben, ist es bereits verwaltet.

Ich bin bei der Bearbeitung von Entitäten auf ähnliche Probleme gestoßen, und das Herausnehmen des Persist hat das Problem behoben. Es tut mir leid, dass dies dieses Mal nicht der Fall war.

1voto

Abdullah Kiser Punkte 51
function get(){
   $query = $repository->createQueryBuilder('E')
    ->select ('E')          
        ->where('(E.type=:type) AND (E.m = :id)')
        ->setParameter('type',  $pType)
        ->setParameter('id',  $pMediaId)
    ->getQuery();
    return $query->getResult();
}

Diese Methode gibt immer eine Objektsammlung zurück, auch wenn Sie nach ID filtern. Wenn Sie also eine einzelne Zeile abrufen wollen, müssen Sie die Methode $query->getSingleResult() anstelle von $query->getResult() . Ich vermute, dass dies das Problem ist, da Sie versuchen, als

$entity = $this->em->get(); // I have the correct value
entity->setTitle('My new title');
$this->em->persist($entity);

$this->em->flush();

0voto

Sam Punkte 769

Das Problem war, dass ich eine Entität zu meiner Viele-zu-Eins Beziehung...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X