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.
Je devais utiliser
$entityManager->merge($data)
Vous devez appeler fusion au lieu de persister:
$data = new MyEntity();
$data->setId(123);
$data->setName('test');
$entityManager->merge($data);
$entityManager->flush();
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.
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.
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.