我有几个外键的表。我需要使用 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请求。
所以,我的问题如下:
非常感谢您的帮助!
更新: 另外,我找到了this,但这看起来已经过时了。
我找到了一些解决方案,但我不确定它的Symfony方式。您可以在下面看到我的解决方案。
答案 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方式,请帮助我改进它!