Как обрезать таблицу с помощью Doctrine? - PullRequest
15 голосов
/ 16 декабря 2011

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

Ответы [ 6 ]

22 голосов
/ 16 декабря 2011

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

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

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

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

12 голосов
/ 22 февраля 2013

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

$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 0;');
$truncateSql = $platform->getTruncateTableSQL('table_name');
$connection->executeUpdate($truncateSql);
$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 1;');
4 голосов
/ 29 января 2015

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

2 голосов
/ 13 июля 2016

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

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

$connection->query('DELETE FROM reception_detail');
$connection->query('ALTER TABLE reception_detail AUTO_INCREMENT = 1');
0 голосов
/ 27 мая 2015

Если вы хотите удалить сущности, включая связанные сущности, которые в конечном итоге связаны внешними ключами, вы можете использовать просто пакетный запрос 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, такой подход может решить вашу проблему.

0 голосов
/ 09 октября 2013

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

Doctrine_Manager::getInstance()->getConnection('doctrine')->getDbh()->exec("TRUNCATE name");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...