php - 在 Symfony/Doctrine 中删除大量用户数据的最佳/快速解决方案

标签 php mysql symfony doctrine-orm doctrine

我正在开发一个 Symfony 2.8 项目,该项目允许注册用户管理联系人、文档、约会等。

现在我想实现一项功能,允许用户重置/删除所有数据。因此,用户帐户本身应保持不变,但所有数据实体应被删除。

目前我正在使用 Doctrine/ORM 方法来循环所有实体并删除它们:

public function deleteAllData($user) {
    $this->currentBatch = 0;
    $this->deleteEntities('MyBundle:Contact', $user);
    $this->deleteEntities('MyBundle:Document', $user);
    ...
    $this->deleteEntities('MyBundle:...', $user);

    $this->flushIfNecessary(true);
}

private function deleteEntities($type, $user) {
   $repo = $this->em->getRepository($type);
   $entities = $repo->findByUser($user);

   foreach ($entities as $entity) {
       $repo->delete($entity);
       $this->flushIfNecessary();
   }
}

private function flushIfNecessary($force = false) {
    $this->currentBatch++;

    if ($force || $this->currentBatch % 100 == 0) {
        $this->em->flush();
        $this->em->clear();
    }
}

虽然这工作正常,但非常慢。使用不同的批量大小,我能够稍微加快该过程,但删除大量条目仍然需要相当长的时间。当然,这是由于所有 ORM 处理都是在后台完成的。

使用简单的 SQL 查询会快得多:

private function deleteEntities($type, $user) {
   $tableName = null;
   $userId = $user->getId();

   switch ($type) {
       case 'MyBundle:Document':
           $tableName = 'document';
           break;
       ...
   }

   if ($tableName && $userId) {
       $this->em->getConnection()->query("
           DELETE FROM $tableName 
           WHERE user_id = '$userId'
       ");
   }
}

这个解决方案也有效,但它需要知道内部数据库结构,例如不同实体的表名称、userId 字段的名称等。

当然,获取这些信息并不是什么大问题,但对我来说,这个解决方案似乎不如第一个解决方案干净。

有没有办法从 Doctrine 获取必要的信息,同时仍然进行简单查询/绕过 ORM

或者是否有更好的解决方案来完成这个任务`?

最佳答案

您的第一种方法很慢,因为 object hydration 。您实际上并不需要加载所有记录并将它们转换为对象。您可以简单地使用 QueryBuilder :

$qb = $em->createQueryBuilder('c');
$qb->delete('MyBundle:Contact', 'c')
   ->where('c.user = :user')
   ->setParameter('user', $user)
   ->getQuery()
   ->execute()
;

或者DQL :

$query = $em->createQuery(
              'DELETE MyBundle:Contact c 
               WHERE c.user = :user')
            ->setParameter('user', $user);
$query->execute();

关于php - 在 Symfony/Doctrine 中删除大量用户数据的最佳/快速解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45162090/

相关文章:

php - Symfony 中的多重过滤

Mysql 结果由多行组成 SQL=INSERT INTO

java - 使用 Hibernate 在 MySQL 上将 TIMESTAMP 复制到 DATETIME

mysql - "AS"clsql中的伪运算符语法

php - 在 PHP 中获取给定一周的开始和结束天数

sql - 为 Symfony2 正确加入 Doctrine2

symfony - 检查每个实体的分页概述的权限

php上传文件错误代码3

php - Apache 仍在使用不正确的权限提供 PHP 文件

php - 从sql数据库实时更新 Highcharts