Persist or not Persist

Publié le 28 octobre 2015 par Rkueny

Utiliser persist() ou ne pas utiliser persist() telle est la question … Le persist(), flush() est un couple que l’on sépare rarement alors qu’en fait s’il y a deux méthodes ce n’est pas pour rien.

Je me suis aperçu que cela n’était pas clair pour tout le monde, donc voici un petit rappel qui pourra vous être utile.

Notice that calling $em->persist($product) isn’t necessary. Recall that this method simply tells Doctrine to manage or “watch” the $product object. In this case, since you fetched the $product object from Doctrine, it’s already managed. Source

Cela vous explique simplement, que lorsque vous déclarez un nouvel objet, vous devez dire à Doctrine de le garder en mémoire avec le persist().

1 $product = new Product();
2 $product->setName('Product name');
3 
4 $em->persist($product);
5 $em->flush();

En revanche, si vous récupérez l’objet depuis Doctrine, vous n’avez pas besoin de lui redire de le garder en mémoire.

1 $product = $em->getRepository("AppBundle:Product")->findOneById($id);
2 $product->setName('Product name');
3 
4 $em->flush();

De plus, Doctrine est suffisament évolué pour savoir que si vous ne modifiez pas l’objet qu’il vous a donné, il n’aura pas besoin de faire un UPDATE lors du flush().

Le flush() équivaut en fait à ouvrir une transaction et à enregister tout les données surveillées depuis le dernier flush().

Un dernier petit point, n’oubliez pas qu’à chaque fois que vous faites un/des persist() puis un flush(), Doctrine fera autant d’INSERT que de persist().

C’est tout pour aujourd’hui, je ne veux plus voir trainer de persist() la où ça n’a pas lieu d’être !