以下のように、多対多の関係(と呼ばれるリンクテーブル内blog_link_tags
)を介して複数のタグが割り当てられているブログ投稿を更新するシナリオがあります。
...
$em = $this->getDoctrine()->getManager();
$blogPost = $em->getRepository('MyBlogBundle:Blog')->find($postId);
$blogPost
->setTitle( $request->request->get('post_title', '') )
->setBody( $request->request->get('post_body', '') )
->setLive(true);
$postTags = json_decode( $request->request->get('post_tags', '') );
$tagRepository = $em->getRepository('MyBlogBundle:BlogTag');
foreach($postTags as $postTag) {
$tag = $tagRepository->find( $postTag->id );
if (!$tag) {
throw $this->createNotFoundException('Tag not found: ' . $tag->title);
}
$blogPost->addTag($tag);
}
$em->flush();
....
おそらくお分かりのように、ブログの投稿を編集して新しいタグを追加すると、重複するレコードが作成されます。
blog_link_tag
現在のブログ投稿IDのレコードのテーブルを切り捨てるか、一意のタグIDのみを挿入するための最良の方法は何ですか?foreachループ内の次の行でそれを行うことでしょうか:
$tag = $tagRepository->find( $postTag->id );
しかし、代わりに、タグが存在するかどうか、およびタグがリンクテーブルにまだ存在していないかどうかを確認してください。それとも、Doctrine 2はそのような行動を達成するためのより良い方法を提供しますか?