2012-03-11 14 views
17

私はSymfony 2の本のセキュリティの章に従っています。多対多テーブルのレコードを削除する

テーブルUSERSGROUPSの例があります。 USERSGROUPSの間にの関係が多対多であり、データベースにUSERGROUPSという名前のテーブルが作成されます。私が欲しいもの

には、例えば、USERGROUPSからレコードを削除することです:

DELETE from USERGROUPS WHERE user_id = 1 and group_id = 1 

私はUSERGROUPS.phpテーブルファイルを持っていないので、私はこれを行う方法を知りません。 DQLを使用して

は、例えば、私はこれを行うことができるようにしたい:

$em = $this->getDoctrine()->getEntityManager(); 
$query = $em->createQuery(
    'DELETE FROM AcmeStoreBundle:UserGroups ug WHERE ug.user_id = :user 
    and ug.group_id = :group' 
)->setParameter(array('user' => $userid, 'group' => $groupid)); 

私はあなたがアイデアを得る願っています。

次に、このテーブルから削除するにはどうすればよいですか?

答えて

17

Doctrineは、表の行ではなくオブジェクトとしてデータを考えます。つまり、Doctrineという言葉では、Groupオブジェクト(グループのユーザを保持します)があり、Userオブジェクトがあります(それぞれにユーザが属するグループを格納するプロパティがあります)。しかし、UserGroupオブジェクトはありません。 Doctrine(と任意のORMシステム)の考え方は、データベースが必要とするかもしれないが、プログラムのオブジェクトモデルに関して必要ではないこれらの中間テーブルを開発者に忘れることです。

あなたがしたいのは、関連するUserオブジェクトを読み込み、$ groupsプロパティからグループを削除し、変更したUserオブジェクトを永続化することです。 DQLのDELETE文は、オブジェクト全体を削除するためのものであり、DQLを使用しない方が簡単だと思います。それらの特性を変更する。

試してみてください。

$user = $em->find('User', $userId); 
$user->removeGroup($groupId); //make sure the removeGroup method is defined in your User model. 
$em->persist($user); 
$em->flush(); //only call this after you've made all your data modifications 

注:あなたはUserモデルでremoveGroup()メソッドを持っていない場合は(私はsymfonyはあなたのための1を生成することができると思いますが、私は間違っている可能性が)、メソッド可能性があり次のように見てください。

//In User.php, and assuming the User's groups are stored in $this->groups, 
//and $groups is initialized to an empty ArrayCollection in the User class's constructor 
//(which Symfony should do by default). 

class User 
{ 
    //all your other methods 

    public function removeGroup($group) 
    { 
     //optionally add a check here to see that $group exists before removing it. 
     return $this->groups->removeElement($group); 
    } 
} 
+0

イーサンを両方のエンティティからremoveメソッドを呼び出す必要があります。どうもありがとうございます!うまくいった: symfonyがこのメソッドを自動的に生成しなかったのはなぜですか?私はあなたの多くのテーブルから何かを削除することが本当に一般的な仕事だと信じています。 –

+0

ええ、私はいつもsymfonyが(addMethodsを生成するので)removeメソッドも生成しないのかどうか疑問に思ってきました。それはうまくいった! – Ethan

+3

このユーザーに関連する多対多テーブルに1,000,000レコードがあり、それを削除する必要がある場合はどうなりますか? Doctrineはすべてのレコードをロードしますか? –

4

@ Ethanの回答に加えて、一方向削除は機能しません。このようmanyToMany関係について、あなたは、例えば、

$user = $em->findOneById($userId); 
$group = $em->findOneById($groupId); 

$user->removeGroup($group); 
$group->removeUser($user); 

$em->persist($user); 
$em->flush(); 
+0

解決策は、テーブルからの削除と同等ですか?col1 = 、col2 = ?結合テーブルでクエリを実行しますか? – Volatil3

+0

それはそうであるようです – Sithu

関連する問題