Symfony2 querybuilder使用外键和alter table进行截断

时间:2015-10-19 05:09:34

标签: sql symfony pdo

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

我找到了两个解决方案:

所以,我试图实现第一个解决方案。 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实现这个方法,那将会有点麻烦。

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

所以,我的问题如下:

  1. 如何使用queryBuilder在Symfony2中执行ALTER TABLE请求?
  2. 为每个PDO执行截断表的最简洁方法是什么?
  3. 是否有任何简洁的方法不仅截断当前表,而且截断每个相关表?
  4. 非常感谢您的帮助!

    更新: 另外,我找到了this,但这看起来已经过时了。

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

1 个答案:

答案 0 :(得分:0)

所以,经过大量的谷歌搜索,我找到了解决方案。 我希望你能为我提供建议,如何改进这一点并使其更紧凑。

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

第二,我创建了Doctrine事件监听器:

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();

}

因此,对于truncate我可以使用“DELETE FROM table”,上面的监听器允许我重置AUTO_INCREMENT;

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