如何使用Doctrine截断表?

时间:2011-12-15 21:03:14

标签: mysql doctrine-orm

我想在我的MySQL数据库中清空一个表。我怎么能用Doctrine做到这一点?

6 个答案:

答案 0 :(得分:21)

使用Doctrine截断表是“简单”的:

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

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

但是你必须知道MySQL一旦有外键约束就无法截断任何表。

答案 1 :(得分:12)

您可以通过Doctrine截断MySQL中的数据,以便忽略外键约束......

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

答案 2 :(得分:4)

我之前将答案概括为我在项目中使用的一个很好的函数,随时可以分享。

/** 
 * @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;');
 }

答案 3 :(得分:2)

如果您使用外键时遇到问题:

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

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

答案 4 :(得分:0)

简短变体(在迁移中最有用)!

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

答案 5 :(得分:0)

如果要删除包含最终通过外键连接的关联实体的实体,可以使用简单的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,这种方法可以解决您的问题。