Как обрезать таблицу в 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();
}
Изменения исходного ответа отмечены в коде комментариями.