我正在尝试删除Doctrine中的记录,但我不知道它为什么不删除。
这是我的代码:
function del_user($id)
{
$single_user = $entityManager->find('Users', $id);
$entityManager->remove($single_user);
$entityManager->flush();
}
另外:我如何回应查询以查看此处发生了什么?
这是一个老问题,似乎还没有答案。作为参考,我将离开这里以供更多参考。你也可以查看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首先对应于有效实体,则第二种方法更好,因为它会在尝试删除实体之前查询数据库中的实体。
在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);
}
}
你首先需要存储库。
$entityManager->getRepository('Users')->find($id);
代替
$single_user = $entityManager->find('Users', $id);
'Users'String是doctrine中Users用户存储库的名称(取决于您使用的是Symfony,Zend。等)。
你检查你的实体是好注释注释吗?
cascade={"persist", "remove"}, orphanRemoval=true
首先,您可能需要检查“用户”是否是您的完全限定类名。如果不检查,则使用命名空间信息将其更新为您的类名。
确保find()返回的对象不为null或不为false,并且在调用EM的remove()之前是实体类的实例。
关于你的另一个问题,我只是使用我的数据库(MySQL)来记录所有查询(因为它只是开发环境),而不是让doctrine返回SQL。
试试你的var_dump()
的$single_user
。如果它是“null
”,它不存在吗?
还要检查“Users”是否是有效的实体名称(没有命名空间?),并且$ id是否引用了用户的PK?
如果你想查看执行的查询,请检查你的mysql / sql / ...日志或查看Doctrine\DBAL\Logging\EchoSQLLogger