2015-10-19 53 views
0

我有几个外键的表。我需要使用queryBuilder截断此表和相关表。Symfony2 querybuilder用外键和alter table截断

我发现两种解决方案:

所以,我试图实施第一个解决方案。 According to this example

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

但是,如果我需要实现为每个这种方法PDO这将是一个有点麻烦。

第二个解决方案看起来像更紧凑,但我不知道,如何做ALTER TABLE请求正确,使用queryBuilder

所以,我的问题如下:

  1. 如何做到使用QueryBuilder的改变Symfony2的表格要求?
  2. 什么是最简洁的方式为每个PDO做截断表?
  3. 它是不是简洁的方式来截断不仅当前表,但每个相关的表?

非常感谢您的帮助!

更新: 另外,我发现this,但是这看起来像外的日期。

我找到了一些解决方案,但我不确定它是Symfony的方式。您可以在下面看到我的解决方案。

+1

关于你提出的第二种解决方案,请注意,在Stack Overflow页面有人说:“请注意,如果不删除外键约束,你仍然不能截断表” –

回答

0

因此,经过大量的谷歌搜索,我找到了解决办法。 我希望你能指教我,如何改善这一点并使之更加紧凑。

首先,我使用onDelete:CASCADE来删除相关表中的数据;

在第二,我已经创建主义事件侦听器:

public function postRemove(LifecycleEventArgs $args) 
{ 
    $entity = $args->getEntity(); 

    $em = $args->getEntityManager(); 
    $qb = $em->getRepository(get_class($entity))->createQueryBuilder('e'); 

    $id = $qb->select('COALESCE(MAX(e.id)+1, 1)')->getQuery()->getSingleScalarResult(); 
    $table = $em->getClassMetadata(get_class($entity))->getTableName(); 

    $sql = sprintf("ALTER TABLE %s AUTO_INCREMENT = %d", $table, $id); 
    $em->getConnection()->prepare($sql)->execute(); 

} 

所以,截断我可以使用“DELETE FROM表”,上面的听众让我重新AUTO_INCREMENT;

但我不确定目前的解决方案是Symfony的方式,请帮助我改进它!