【问题标题】:Doctrine Query Builder delete all entries from TableDoctrine Query Builder 删除表中的所有条目
【发布时间】:2016-10-03 18:53:18
【问题描述】:

我在使用查询生成器删除 id 找到的所有记录时遇到了一些问题 我尝试了下面的代码,但我总是收到这个错误:

 [Semantical Error] line 0, col 53 near 'b.id = :surv': Error: 'b' is not defined. 

方法:

public function deleteUsers($surveyId) {
    $qb = $this->getEntityManager()->createQueryBuilder();

    return $qb
        ->delete()
        ->from(BaseUser::class, 'a')
        ->leftJoin('a.survey', 'b')
        ->where('b.id = :survey')
        ->setParameter('survey', $surveyId)
        ->getQuery()
        ->execute()
        ;
}

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    您根本不能在使用 Doctrine 的删除语句中使用连接。 一个机会可能是首先获取应该从您的连接结果中删除的 id,然后执行一个简单的“删除 id 所在的位置”。这将起作用。

    请同时查看此问题/答案:Doctrine QueryBuilder delete with joins

    【讨论】:

    • 这就像我最后所做的那样 :-D 发现我不能将连接与删除一起使用,您需要获取并执行 foreach :-D ... 花了我一些时间找到那个链接昨晚并没有发布答案我是怎么做到的。
    • 您不必执行 foreach,您可以通过第一次选择获取实体的所有 ID。然后删除您的 ID(您刚刚通过选择找到的 ID)。虽然@Massimiliano 的回答是正确的,但使用 delete from where 比一个一个删除它们要快得多。
    【解决方案2】:
    public function deleteAllEmployees(){
            $query = $this->createQueryBuilder('e')
                     ->delete()
                     ->getQuery()
                     ->execute();
            return $query;
    }
    

    现在,在Controller 内部使用em->deleteAllEmployees() 之类的实体管理器对象调用此函数。别忘了flush()

    【讨论】:

      【解决方案3】:

      尝试将 b 添加为 $qb->delete(YourEntityForB::class,'b') 的参数

      【讨论】:

        【解决方案4】:
        return $qb->delete(EntityB::class, "b")
                  ->from(BaseUser::class, 'a')
                  ->where('b.id = :survey')
                  ->setParameter('survey', $surveyId)
                  ->getQuery()
                  ->execute()
               ;
        

        【讨论】:

        • 就像我写的一样,我得到了这个错误:[Syntax Error] line 0, col 49: Error: Expected end of string, got ','
        • 你能告诉我$surveyId 的值是多少吗?
        • int 类型,值为 '1'
        【解决方案5】:

        从 QueryBuilder 中删除完全违背了拥有 ORM 的目的。

        您永远不应该考虑您的数据库行,而应该只考虑您的实体对象。 ORM 负责将您的实体映射到(和从)您的表行。

        因此,您应该获取需要删除的实体的集合并一个一个地删除它们

        【讨论】:

        • 会特别慢
        • 使用 ORM 并不意味着您必须使用未优化的查询,尤其是当您的网站将有一些严重的流量时。为工作使用正确的工具,在本例中是 QueryBuilder 或 DQL。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 1970-01-01
        • 2015-10-22
        • 2013-07-04
        相关资源
        最近更新 更多