我想在我的MySQL数据库中清空一个表。我怎么能用Doctrine做到这一点?
答案 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,这种方法可以解决您的问题。