【问题标题】:Symfony2 querybuilder truncate with foreign key and alter tableSymfony 查询生成器使用外键截断并更改表
【发布时间】:2016-01-17 08:42:44
【问题描述】:

我有几个外键的表。我需要使用 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. 如何在 Symfony2 中使用 queryBuilder 进行 ALTER TABLE 请求?
  2. 为每个 PDO 截断表的最紧凑方法是什么?
  3. 是否有任何紧凑的方法不仅可以截断当前表,还可以截断每个相关表?

非常感谢您的帮助!

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

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

【问题讨论】:

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

标签: sql symfony pdo


【解决方案1】:

所以,经过大量谷歌搜索后,我找到了解决方案。 我希望你能给我建议,如何改进它并使其更紧凑。

起初,我使用 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();

}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2020-11-24
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    相关资源
    最近更新 更多