2016-08-31 14 views
1

私は簡単なブログ投稿システムを作成しています。私はちょうど2つのエンティティNewsとTagを持っています。Doctrine:dbに存在しない場合は、関連オブジェクト(タグ)を挿入してください

ニュースとタグの間に「manyToMany」関係を作成しました。

Doctrineはこのような私のニュースや自分のタグとの間の関係をマッピングするために、私のデータベースに(news_tagと呼ばれる)第三のテーブルを作成しました:

+------+----------+------+ 
| ID | news_id |tag_id| 
+------+----------+------+ 
| 1 | 1  | 1 | 
| 2 | 1  | 2 | 
| 3 | 2  | 3 | 
| 4 | 2  | 2 | 
+------+----------+------+ 

私はデシベルでニュースを追加するときに関係が正常に動作します。タグはニュースに自動的に割り当てられます

私の問題は です。私のタグテーブルのフィールド名は一意です。私は普通だと思います。

ここで、2つのニュースに同じタグ「11月」を追加しています。 。 。私はユニークなキー制約違反を取得します!

このケースでは、Dotrineは私のタグテーブルに重複したタグを挿入しようとするべきではないと考えました。

私はこの場合、doctrineは 'tag'というテーブルにタグを挿入することなく、重複したタグの関係(news_tagという名前のテーブルに関係を挿入することによって)をマップすることになります。キー制約)

問題を解決するのに手伝ってもらえますか?ここ

編集がニュースを追加するために、私のコントローラのコードです:

public function insertNewsAction(Request $request) 
    { 
     try{ 
     $em = $this->getDoctrine()->getManager(); 
     $news = new News(); 

     $formNews = $this->createForm(NewsType::class, $news); 
     $formNews->handleRequest($request); 
     $postedDatas = $formNews->getData(); 

     /* handling of tags field */  
     $tagsTemp = $postedDatas->getTags(); 
     $tags = explode(';', $tagsTemp); 

     // convert textfield of my form to ArrayCollection 
     $news->setTags(new ArrayCollection); 

     foreach($tags as $singleTag) 
     { 
      $tag = new Tag(); 
      $tag->setName($singleTag); 
      $news->addTag($tag); 
     } 

     $em->persist($news); 
     $em->flush(); 
     $this->addFlash('notice', 'News is correctly inserted'); 

     return $this->render('MyBundle:Form:news.html.twig'); 
     } catch (Exception $ex) { 
      $this->addFlash('error', 'Flush error. Error news1'); 
      $this->render('MyBundle:Form:news.html.twig'); 
     } 
    } 
+0

してください私達にあなたのコードを示しています。私はあなたがそれらを再利用するべきである間にすべての 'post'のための新しい' Tag'エンティティを作成していると思います... –

+0

はい、そうです。私はそれぞれの投稿に対して新しいTagエンティティを作成しています。私は2分で私のコードを投稿しています – zm455

答えて

1

あなたが直面している問題は、すべてのポストのための新しいTagエンティティを作成しているということなので、Doctrine試みは、それらを永続化するために、その後、データベースは独自の制限について苦情を申し立てます。

あなたの挿入コードは、のようになります、

$news = //get the NEWS to persist 
foreach($tags as $tag) 
{ 
    if (($persistedTag = $entityManager->getRepository('AppBundle:Tag')->findOneByName($tag))==null) 
    { 
     $persistedTag = new Tag(); 
     //Fill the new Tag entity 
     $entityManager->persist($persistedTag); 
    } 
    $persistedTag->addNews($news); 
    $news->addTag($persistedTag); 
} 
$entityManager->flush(); 
+0

はい、私はすでにそのソリューションを実装しようとしており、うまくいきます。 しかし、関係をマップするために 'news_tag'というテーブルを自分自身で更新する必要がありますか? 簡単な例:私はすでにデータベースに「11月」という名前のタグを持っています。 。 。 今、私は新しいニュースを挿入しています。タグは「11月」です。 。 。私はokタグを挿入しませんが、そのニュースをタグ 'novemeber'にマッピングする必要があります。 。 。 news_tagというテーブルを更新できますか? – zm455

+0

私の提案したコードを見てください:あなたは 'november'タグを見つけてそれをニュースに追加する必要があります。また、そのタグにニュースを追加します(私のコードでは '$ persistedTag'と呼んでいます) –

+0

申し訳ありませんが、私のタグエンティティでは、私は 'news'というプロパティを持っていません。これは双方向関係ですか? 私はあなたのソリューションを実装しようとしています。10分後に戻ってきます。 – zm455

関連する問題