如何使用Doctrine截断表?

Daw*_*hia 15 mysql doctrine-orm

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

小智 23

使用Doctrine截断表是"简单"的:

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

$connection->executeUpdate($platform->getTruncateTableSQL('my_table', true /* whether to cascade */));
Run Code Online (Sandbox Code Playgroud)

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

  • `executeUpdate()` 现已弃用。这个答案可以更新吗? (2认同)

Jam*_*all 13

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

$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 0;');
$truncateSql = $platform->getTruncateTableSQL('table_name');
$connection->executeUpdate($truncateSql);
$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 1;');
Run Code Online (Sandbox Code Playgroud)


use*_*918 5

之前,我将答案概括为我在项目中使用过的一个不错的功能,可以随时分享。

/** 
 * @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;');
 }
Run Code Online (Sandbox Code Playgroud)