【问题标题】:symfony2 Doctrine delete an array of objectssymfony2 Doctrine 删除对象数组
【发布时间】:2014-03-07 18:58:45
【问题描述】:

我想从数据库中删除与 Symfony2 中特定 user_id 匹配的所有记录。

$em = $this->getDoctrine()->getManager();
$user_service = $em->getRepository('ProjectTestBundle:UserService')
->findByUser($this->getUser()->getId());

这可能会返回一些匹配的对象,所以当我运行时:

$em->remove($user_service);
$em->flush();

发生错误:

EntityManager#remove() expects parameter 1 to be an entity object, array given.

如何删除所有符合特定条件的记录(对象)? 顺便说一句,当我在 mysql 中运行等效的 sql 语句时,它可以完美运行。

【问题讨论】:

    标签: php symfony doctrine


    【解决方案1】:

    为什么不直接遍历对象数组?

    $user_services = $em->getRepository('ProjectTestBundle:UserService')
    ->findByUser($this->getUser()->getId());
    
    foreach ($user_services as $user_service) {
        $em->remove($user_service);
    }
    
    $em->flush();
    

    【讨论】:

    • 非常感谢,马库斯。
    • 没问题,有时你只见树木不见森林......发生了:P
    • 确实 :)) 我之前尝试过 while/for 循环;暂时忘记了 foreach。
    • 感谢您的解决方案,我在想有一个 Doctrine 风格的解决方案。 :)
    • 作为@zennin,我期待有一个 Doctrine 原生解决方案。虽然我不想使用循环,但我认为它可以解决问题;D
    【解决方案2】:

    你也可以这样使用:

    $user_services = $em->getRepository('ProjectTestBundle:UserService')->findByUser($this->getUser()->getId());
    array_walk($user_services, array($this, 'deleteEntity'), $em);
    $em->flush();
    

    然后在你的控制器中添加这个方法:

    protected function deleteEntity($entity, $key, $em)
    {
        $em->remove(entity);
    }
    

    或者干脆使用:

    $user_services = $em->getRepository('ProjectTestBundle:UserService')->findByUser($this->getUser()->getId());
    $this->deleteEntities($em, $user_services);
    $em->flush();
    
    ...
    
    protected function deleteEntities($em, $entities)
    {
        foreach ($entities as $entity) {
            $em->remove($entity);
        }
    }
    

    请注意,当使用PropelPropelBundle 时,PropelObjectCollection 实现了delete() 函数,因此您不必手动执行此循环。

    【讨论】:

    • 第一种方法,你就不能array_walk($user_services, array($em, 'remove'));吗?
    • 是的,但是在deleteEntities 方法中,所以你不必每次都重写这段代码。
    【解决方案3】:

    您也可以使用学说查询生成器delete 方法。

    public function deleteAllByUser(UserInterface $user)
    {
        $query = $this->createQueryBuilder('related_entity')
            ->delete()
            ->andWhere('related_entity.user = :user')
            ->setParameter('user', $user)
            ->getQuery();
    
        return $query->execute();
    }
    

    【讨论】:

      【解决方案4】:

      如果你返回一个对象,你只需要写:

       ->findOneByUser,
      

      您不需要 foreach 循环。如果你的返回是一个数组,那么你需要做->findByUser并写一个for循环:

      foreach ($entities as $entity)
      {
        //do something
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-20
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 2014-03-26
        相关资源
        最近更新 更多