Doctrine2 – Truncate Table dans DataFixture

Un vrais Truncate Table avec doctrine dans les DataFixture

Doctrine étant parfois un peu quiche… Lorsqu’on lui demande de faire un truncate table lors de l’exécution de la commande de datafixture, doctrine est tout simplement incapable de réaliser cette action car il existe des relations entre les tables.

Donc voici une méthode à utiliser dans vos dataFixtures qui permet de faire un trucate table qui fonctionne (dans mon cas en tout cas…).
Les deux seules choses à paramétrer sont l’emplacement de vos Entity et le début de leur namespace.


namespace WaldoWonderlandBundleDataFixturesORM;

use DoctrineCommonPersistenceObjectManager;
use DoctrineCommonDataFixturesFixtureInterface;
use DoctrineCommonDataFixturesOrderedFixtureInterface;
use SymfonyComponentDependencyInjectionContainerAware;
use SymfonyComponentFinderFinder;

/**
 * Purge de la base de données
 * Purge/Vide les données de la base de données
 * La base étant géré par le moteur InnoDB qui prend en compte les relations entre les table, Doctrine est dans l'incapacité à effectuer cette tâche
 *
 *
 * @uses $ php app/console doctrine:fixtures:load --append
 */
class Load00TruncateTable extends ContainerAware implements FixtureInterface, OrderedFixtureInterface
{

    private $tableToTruncateList = array();
    private $connection;

    //A voir pour être utilisé dans le CronBundle
    public function load(ObjectManager $manager)
    {

        $this->connection = $manager->getConnection();

        $this->connection->executeUpdate("SET FOREIGN_KEY_CHECKS=0;");

        /* @var $classMetadata DoctrineORMMappingClassMetadata */
        foreach ($manager->getMetadataFactory()->getAllMetadata() as $classMetadata) {

            $this->truncateTable($classMetadata->getTableName());

            foreach ($classMetadata->getAssociationMappings() as $field) {
                if (isset($field['joinTable']) && isset($field['joinTable']['name'])) {
                    $this->truncateTable($field['joinTable']['name']);
                }
            }
        }

        $this->connection->executeUpdate("SET FOREIGN_KEY_CHECKS=1;");
    }

    private function truncateTable($tableName)
    {
        if (!in_array($tableName, $this->tableToTruncateList)) {
            $this->connection->executeUpdate($this->connection->getDatabasePlatform()->getTruncateTableSQL($tableName));
            $this->tableToTruncateList[] = $tableName;
        }
    }

    /**
     * Définit dans quel ordre les fixtures doivent être lancé
     */
    public function getOrder()
    {
        return 1; // the order in which fixtures will be loaded
    }

}

C’est classe, non?

Publié dans Doctrine, PHP, Symfony2

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*