Как обрезать таблицу с помощью Doctrine?

Я хочу очистить таблицу в моей базе данных MySQL. Как я могу сделать это с помощью Doctrine?

Ответы

Ответ 1

Усечение таблицы с помощью Doctrine так же просто:

$connection = $entityManager->getConnection();
$platform   = $connection->getDatabasePlatform();

$connection->executeUpdate($platform->getTruncateTableSQL('my_table', true /* whether to cascade */));

Но вы должны знать, что MySQL не сможет обрезать любую таблицу, если у нее есть ограничение внешнего ключа.

Ответ 2

Вы можете обрезать данные в MySQL через Doctrine, чтобы игнорировать ограничения внешнего ключа...

$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 0;');
$truncateSql = $platform->getTruncateTableSQL('table_name');
$connection->executeUpdate($truncateSql);
$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 1;');

Ответ 3

Я обобщил ответ раньше на приятную функцию, которую я использовал в своем проекте, не стесняйтесь делиться.

/** 
 * @param array $tableNames Name of the tables which will be truncated.
 * @param bool $cascade 
 * @return void
 */
 public function truncateTables($tableNames = array(), $cascade = false) {
    $connection = $this->em->getConnection();
    $platform = $connection->getDatabasePlatform();
    $connection->executeQuery('SET FOREIGN_KEY_CHECKS = 0;');
    foreach ($tableNames as $name) {
        $connection->executeUpdate($platform->getTruncateTableSQL($name,$cascade));
    }
    $connection->executeQuery('SET FOREIGN_KEY_CHECKS = 1;');
 }

Ответ 4

Если у вас есть проблема с внешним ключом, я работаю с:

$connection = $this->em->getConnection();
$connection->beginTransaction();

$connection->query('DELETE FROM reception_detail');
$connection->query('ALTER TABLE reception_detail AUTO_INCREMENT = 1');

Ответ 5

Короткий вариант (наиболее полезный для миграции)!

Doctrine_Manager::getInstance()->getConnection('doctrine')->getDbh()->exec("TRUNCATE name");

Ответ 6

Если вы хотите удалить объекты, включая ассоциированные объекты, которые в конечном итоге подключены внешними ключами, вы можете использовать простой пакетный запрос DQL вместо усечения:

$q = $em->createQuery('delete from AppBundle\Entity\Customer');
$numDeleted = $q->execute();

http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html#dql-delete

Это будет работать только с ассоциациями, если вы правильно сконфигурировали каскадные операции и orphanRemoval, например:

class Customer
{
    /**
     * @ORM\OneToOne(targetEntity="Address", cascade={"all"}, orphanRemoval=true)
     */
    public $address;
}

Это не прямой ответ в отношении команды MySQL TRUNCATE, но поскольку он используется для Doctrine, этот подход может решить вашу проблему.