Как обрезать таблицу в symfony 3?

Я хочу усечь таблицу в Symfony 3.0

Я использую следующий подход.

создать Entity: User.php

Создать репозиторий: UserRepository.php

/**
 * UserRepository 
 */

namespace UserBundle\Entity;

use Doctrine\ORM\EntityRepository;


class UserRepository extends EntityRepository {

    public function truncateTable() {
        $em = $this->getEntityManager();
        $dql = 'TRUNCATE TABLE UserBundle:User';
        $query = $em->createQuery($dql);

        return $query->getResult();
    }

}

Когда я пытаюсь запустить этот код из контроллера: я получаю следующее сообщение:

[2/2] QueryException: [Синтаксическая ошибка], строка 0, столбец 0: Ошибка: ожидается SELECT, UPDATE или DELETE, получено 'TRUNCATE'

Кто-нибудь может мне подсказать?

1 ответ

Решение

Код ниже должен помочь вам

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

Ответ от @Alexandru Cosoi очень хорош и с небольшими настройками может использоваться в среде PostgreSQL:

    $classMetaData = $em->getClassMetadata($className);
    $connection = $em->getConnection();
    $dbPlatform = $connection->getDatabasePlatform();
    $connection->beginTransaction();
    try {
        // optional, but with this SET it should work with wider range of configurations
        $connection->query('SET CONSTRAINTS ALL DEFERRED');
        // more importantly - second param for getTruncateTableSql() method is set to true
        $q = $dbPlatform->getTruncateTableSql($classMetaData->getTableName(), true);
        $connection->executeUpdate($q);
        $connection->commit();
    } catch (\Exception $e) {
        var_export($e->getMessage());
        $connection->rollback();
    }

Изменения исходного ответа отмечены в коде комментариями.

Другие вопросы по тегам