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 unflush()
, Doctrine fera autant d’INSERT
que depersist()
.
C’est tout pour aujourd’hui, je ne veux plus voir trainer de persist()
la où ça n’a pas lieu d’être !