web-dev-qa-db-fra.com

Comment tronquer une table avec Doctrine 2?

Je suppose que je dois créer une requête native pour tronquer une table à l'aide de Doctine2.

$emptyRsm = new \Doctrine\ORM\Query\ResultSetMapping();
$sql = 'TRUNCATE TABLE Article';
$query = em()->createNativeQuery($sql, $emptyRsm);
$query->execute();

Cela donne l'erreur

SQLSTATE[HY000]: General error

Que dois-je changer dans mon code pour que cela fonctionne?

28
murze

Voici le code que j'utilise:

$cmd = $em->getClassMetadata($className);
$connection = $em->getConnection();
$dbPlatform = $connection->getDatabasePlatform();
$connection->beginTransaction();
try {
    $connection->query('SET FOREIGN_KEY_CHECKS=0');
    $q = $dbPlatform->getTruncateTableSql($cmd->getTableName());
    $connection->executeUpdate($q);
    $connection->query('SET FOREIGN_KEY_CHECKS=1');
    $connection->commit();
}
catch (\Exception $e) {
    $connection->rollback();
}
37
Maxence

Ou vous pouvez simplement essayer ceci:

$this->getEm()->createQuery('DELETE AcmeBundle:Post p')->execute();

Si vous avez des relations, veillez à manipuler les entités liées.

13
piers.warmers

Ceci est un exemple de méthode de tronquage d'un trait dans des tests unitaires.

/**
 * Cleanup any needed table abroad TRUNCATE SQL function
 *
 * @param string $className (example: App\Entity\User)
 * @param EntityManager $em
 * @return bool
 */
private function truncateTable (string $className, EntityManager $em): bool {
    $cmd = $em->getClassMetadata($className);
    $connection = $em->getConnection();
    $connection->beginTransaction();

    try {
        $connection->query('SET FOREIGN_KEY_CHECKS=0');
        $connection->query('TRUNCATE TABLE '.$cmd->getTableName());
        $connection->query('SET FOREIGN_KEY_CHECKS=1');
        $connection->commit();
        $em->flush();
    } catch (\Exception $e) {
        try {
            fwrite(STDERR, print_r('Can\'t truncate table ' . $cmd->getTableName() . '. Reason: ' . $e->getMessage(), TRUE));
            $connection->rollback();
            return false;
        } catch (ConnectionException $connectionException) {
            fwrite(STDERR, print_r('Can\'t rollback truncating table ' . $cmd->getTableName() . '. Reason: ' . $connectionException->getMessage(), TRUE));
            return false;
        }
    }
    return true;
}

Veuillez noter que si vous n'utilisez pas $em->flush(), vous risquez d'avoir un problème avec la requête suivante à la doctrine.

Vous devez également comprendre que si vous utilisez cette méthode dans un contrôleur, vous devez remplacer les lignes fwrite(STDERR, print_r(... par quelque chose que votre service d’enregistrement peut utiliser.

0
Borys Ermokhin