Как обрезать таблицу с помощью 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, этот подход может решить вашу проблему.