【问题标题】:DELETE query not working in DQL doctrine Symfony2DELETE 查询在 DQL 学说 Symfony2 中不起作用
【发布时间】:2015-07-02 06:22:10
【问题描述】:

我要根据 ID 删除一行,我使用这个查询来完成任务:

 $em = $this->getDoctrine()->getManager();
    $query = $em->createQuery('DELETE buss from StreetBumbApiBundle:BussOwner buss WHERE buss.id = :bussId')
        ->setParameter("bussId", $bussId);
    $list = $query->getResult();

但我收到此错误:

{ “代码”:500, “消息”:“[语义错误] 第 0 行,第 7 列靠近‘来自 StreetBumbApiBundle:BussOwner’的总线:错误:未定义类‘总线’。” }

我做错了什么?

【问题讨论】:

    标签: symfony doctrine-orm dql


    【解决方案1】:

    您可以使用 QueryBuilder 轻松解决这个问题:

    $em = $this->getDoctrine()->getManager();
    $qb = $em->createQueryBuilder();
    $query = $qb->delete('StreetBumbApiBundle:BussOwner', 'buss')
                ->where('buss.id = :bussId')
                ->setParameter('bussId', "bussId")
                ->getQuery();
    
    $query->execute();
    

    顺便说一句:如果您将 getQuery 替换为 getDQL,您可以看到它如何转换为 DQL(或 getSQL

    您的方法中本质上的错误是您的 Delete 语句中的 from,因为 DQL 中的 delete 看起来像这样:

    $em = $this->getDoctrine()->getManager();
    $query = $em->createQuery(
                  'DELETE StreetBumbApiBundle:BussOwner buss 
                   WHERE buss.id = :bussId')
                ->setParameter("bussId", $bussId);
    
    $query->execute();
    

    另外,我不确定你为什么使用$query->getResult()。 删除的预期结果是什么? $query->execute(); 完成这项工作。

    除此之外,如果您不执行复杂的删除语句,并且在您的情况下,您正在删除使用 Id 查询的实体。

    为什么不:

    $em = $this->getDoctrine()->getManager();
    $em->remove($entity);
    

    因此将实体,而不仅仅是 Id 传递给您的删除函数?

    【讨论】:

    • 我猜你的解决方案工作正常,因为它试图删除该行但由于外键约束它给了我这个错误:"An exception occurred while executing 'DELETE FROM BussOwner WHERE id = ?' with params [\"2\"]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (withinseventytwo.offerList, CONSTRAINT FK_85A42F448195E83B`外键 (bussId) 引用 BussOwner (id))"`
    • 取决于你想做什么。是否也要删除引用的对象?然后级联删除(参见学说中的实体引用定义)。或者你不能。然后你可以例如 softdelete,使用类似 deletedAt 的字段,默认情况下为空,如果删除则有日期。然后您的删除将成为要删除的行的更新查询。
    • 不错的答案。完美的解决方案。谢谢你:)
    • 只是一个很小但很重要的提醒。如果您选择实体删除选项并使用$em->remove($entity);,那么不要忘记刷新实体管理器以使用$em->flush(); 执行。
    【解决方案2】:

    替代解决方案:您的 DQL 不是一个好的,试试这个

     $em = $this->getDoctrine()->getManager();
     $query = $em->createQuery(
         'DELETE 
            StreetBumbApiBundle:BussOwner buss 
          WHERE 
            buss.id = :bussId'
          )
          ->setParameter("bussId", $bussId);
    
     $result = $query->execute();
    

    【讨论】:

    • 只是添加一个注释 - 因为您不期望任何类型的结果,所以在 ->setParameter() 之后运行查询更好的链方法 ->execute(),而不是 getResult()。除此之外,查询看起来还不错。
    • @Artamiel:是的,当然,我只是复制/粘贴并没有注意到 ;)
    • { "code": 500, "message": "[Semantical Error] line 0, col 7'buss from StreetBumbApiBundle:BussOwner' 附近:错误:未定义类'buss'。" }
    • @Geetika:是的,我知道他的解决方案很好,但我的(替代方案)也很好。不知道为什么你会遇到同样的错误,但我检查了我的代码(在回答之前没有这样做),我可以看到我在某处使用了这个合成器并且它可以工作
    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多