删除Doctrine中的记录

时间:2013-10-23 11:50:30

标签: php symfony doctrine-orm doctrine

我试图删除Doctrine中的记录,但我不知道它为什么不删除。

这是我的代码:

function del_user($id)
{
    $single_user = $entityManager->find('Users', $id);

    $entityManager->remove($single_user);

    $entityManager->flush();
}

另外:如何回复查询以查看此处发生了什么?

7 个答案:

答案 0 :(得分:18)

这是一个老问题,但似乎还没有答案。作为参考,我将离开这里以供更多参考。您也可以查看doctrine documentation

要删除记录,您需要(假设您在控制器中):

// get EntityManager
$em = $this->getDoctrine()->getManager();

// Get a reference to the entity ( will not generate a query )
$user = $em->getReference('ProjectBundle:User', $id);

// OR you can get the entity itself ( will generate a query )
// $user = $em->getRepository('ProjectBundle:User')->find($id);

// Remove it and flush
$em->remove($user);
$em->flush();

使用第一种获取reference的方法通常会更好,如果您只是想删除实体而不先检查它是否存在,因为它不会查询数据库并且只会创建一个代理对象您可以用来删除您的实体。

如果你想确保这个ID首先对应一个有效的实体,那么第二种方法更好,因为在尝试删除它之前它会查询你的实体的数据库。

答案 1 :(得分:2)

**

Doctrine 删除记录问题

** 我的理解是,如果您需要删除具有学说关系的学说中的记录,例如。 OneToMany、ManyToMany 和关联不能轻易删除,直到您 将引用另一个关系的字段设置为 null。

......

您可以将其用于非关系学说

  $entityManager=$this->getDoctrine()->getManager();
 $single_user=$this->getDoctrine()->getRepository(User::class)->findOneBy(['id'=>$id]);

    $entityManager->remove($single_user);

    $entityManager->flush();
                       

但是对于关系学说,将引用另一个关系的字段设置为空

$entityManager=$this->getDoctrine()->getManager();
     $single_user=$this->getDoctrine()->getRepository(User::class)->findOneBy(['id'=>$id]);
     {# assume you have field that reference #}
       
       $single_user->setFieldData(null);
        $entityManager->remove($single_user);

    $entityManager->flush();

答案 2 :(得分:1)

在Silex路线中,我喜欢这样,以防有人帮助:

$app->get('/db/order/delete', function (Request $request) use ($app) {
...

  $id = $request->query->get('id');

  $em = $app['orm.em']; //or wherever your EntityManager is
  $order = $em->find("\App\Entity\Orders",$id); //your Entity

  if($order){
    try{
      $em->remove($order);
      $em->flush();
    }
    catch( Exception $e )
    {
      return new Response( $e->getMessage(), 500 );
    }
    return new Response( "Success deleting order " . $order->getId(), 200 );
  }else{
    return new Response("Order Not Found", 500);
  }
}

答案 3 :(得分:0)

尝试var_dump() $single_user。如果是“null”,它就不存在了吗?

还要检查“Users”是否是有效的实体名称(没有命名空间?),$ id是否引用了用户的PK?

如果您想查看执行的查询,请检查您的mysql / sql / ...日志或查看Doctrine \DBAL\Logging\EchoSQLLogger

答案 4 :(得分:0)

您首先需要存储库。

$entityManager->getRepository('Users')->find($id);  

而不是

$single_user = $entityManager->find('Users', $id);

'用户'字符串是学说中用户存储库的名称(取决于您使用的是Symfony,Zend。等)。

答案 5 :(得分:0)

你是否将你的实体检查为好注释注释?

cascade={"persist", "remove"}, orphanRemoval=true

答案 6 :(得分:0)

首先,您可能需要检查'用户'是否是您的完全限定类名。如果不检查,则使用命名空间信息将其更新为您的类名。

确保find()返回的对象不为null或不为false,并且在调用EM的remove()之前是实体类的实例。

关于你的另一个问题,我只是使用我的数据库(MySQL)来记录所有查询(因为它只是开发环境),而不是让doctrine返回SQL。