web-dev-qa-db-ja.com

Doctrineのレコードを削除します

Doctrineでレコードを削除しようとしていますが、なぜそれが削除されないのかわかりません。

これが私のコードです:

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

    $entityManager->remove($single_user);

    $entityManager->flush();
}

プラス:ここで何が起こっているかを確認するためにクエリをエコーするにはどうすればよいですか?

12
Hassan Sardar

これは古い質問であり、まだ回答がないようです。参考までに、ここで詳細を確認しておきます。 Doctrineのドキュメント も確認できます

レコードを削除するには、次のことを行う必要があります(コントローラーにいると想定)。

// 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 を取得する最初の方法を使用すると、エンティティが存在するかどうかを最初に確認せずにエンティティを削除するだけの場合は、DBにクエリを実行せず、エンティティの削除に使用できます。

最初にこのIDが有効なエンティティに対応していることを確認したい場合は、エンティティを削除する前にDBにクエリを実行する2番目の方法の方が適しています。

23
Ramy Nasr

誰かを助ける場合に備えて、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);
  }
}
1
Vladtn

最初にリポジトリが必要です。

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

の代わりに

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

'Users'文字列はdoctrine(Symfony、Zendなどを使用しているかどうかによって異なります)のユーザーリポジトリの名前です。

0
Mihai Enescu

$single_uservar_dump()を試してください。 「null」の場合、存在しませんか?

また、 "Users"が有効なエンティティ名(名前空間なし)であるかどうかを確認し、$ idがユーザーのPKを参照しているかどうかを確認します。

実行されたクエリを確認したい場合は、mysql/sql/...ログを確認するか、Doctrine\DBAL\Logging\EchoSQLLoggerを調べてください

0
NLZ

エンティティを適切なコメント注釈としてチェックしますか?

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

最初に、「ユーザー」が完全修飾クラス名であるかどうかを確認する必要がある場合があります。チェックされていない場合は、名前空間情報を使用してクラス名に更新します。

EMのremove()を呼び出す前に、find()によって返されたオブジェクトがnullまたはfalseではなく、エンティティクラスのインスタンスであることを確認してください。

他の質問に関しては、doctrine SQLを返すのではなく、データベース(MySQL)を使用してすべてのクエリをログに記録します(開発環境のみ)。

0
Pradeep