web-dev-qa-db-fra.com

Doctrine 2 mise à jour de l'entité

Est-il possible de mettre à jour une entité de la même manière que ci-dessous:

$data       = new ATest();  // my entity
$data->id   = 1;            // id 1 already exists, I just want to update this row
$data->name = "ORM Tested"; // changed the name

$entityManager->persist($data);
$entityManager->flush();

Cela insérera et modifiera l'ID de l'objet au lieu de mettre à jour la ligne existante dans la base de données.

43
Dennis

Je devais utiliser

$entityManager->merge($data)
53
Dennis

Vous devez appeler fusion au lieu de persister:

$data = new MyEntity();
$data->setId(123);
$data->setName('test');

$entityManager->merge($data);
$entityManager->flush();
88
Francesco Casula

Ou obtenez simplement l'entité gérée plutôt qu'une entité vide.

$data = $entityManager->getRepository('ATest')->findOne(1); // ATest is my entitity class
$data->name = "ORM Tested"; // just change the name

$entityManager->persist($data);
$entityManager->flush();

Si l'entité est déjà gérée, persist () la mettra à jour plutôt que d'en insérer une nouvelle.

13
Tony Bogdanov

Vous pouvez également utiliser getReference pour mettre à jour une propriété d'entité par identifiant sans récupérer l'état de la base de données.

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/advanced-configuration.html#reference-proxies

Cela établira un proxy simple pour travailler avec l'entité par ID au lieu d'instancier un new Entity Ou d'obtenir explicitement l'entité de la base de données à l'aide de find(), qui peut ensuite être mise à jour par vidage.

$data = $entityManager->getReference('ATest', $id);
$data->setName('ORM Tested');
$entityManager->flush();

Ceci est particulièrement utile pour mettre à jour les associations OneToMany ou ManyToMany d'une entité. EG: $case->addTest($data);

Il est généralement mauvais de définir manuellement l'identifiant d'une nouvelle entité, même si l'intention est de mettre à jour l'entité. Au lieu de cela, il est généralement préférable de laisser l'EntityManager ou le constructeur Entity établir les identificateurs appropriés, tels qu'un UUID. Pour cette raison Doctrine générera par défaut des entités avec l'identifiant comme propriété privée sans méthode de définition.

12
fyrye