Enregistrer en masse avec Doctrine

Enregistrer en masse avec Doctrine
par Rémi Leclerc, le 01/12/2015

Pour enregistrer en masse (au-delà de quelques milliers de lignes par exemple) dans votre base de données, la méthode consiste à ne pas utiliser flush() après chaque enregistrement et à détacher réguilèrement les objets gérés par Doctrine.

foreach ($i = 1; $i <= 100000; $i++) {
    $entite = new Entite();
    $entite->setNom('Entite '.$i);
    $this->entiteManager->persist($entite);

    if (($i % 100) == 0) {
        $em->flush();
        $em->clear();
    }
}

$em->flush();
$em->clear();

Dans notre exemple, nous souhaitons enregistrer 100 000 lignes en base et nous n'effectuons un flush() que tous les 100 enregistrements. Juste après notre flush(), nous détachons les entités avec clear().

À noter que plus d'entités ont été persistées, plus le flush() dure longtemp, il faut donc correctement doser le nombre d'entités à persister en testant et re-testant.