2016-08-31 7 views
1

간단한 블로그 게시물 시스템을 만들고 있습니다. 2 개의 엔티티 뉴스와 태그 만 있습니다.Doctrine : db에 존재하지 않는 경우 관련 개체 (태그)를 삽입하십시오.

뉴스와 태그 사이에 "manyToMany"관계를 만들었습니다. 내 DB에 뉴스를 추가 할 때

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

의 관계가 잘 작동 :

교리는이 같은 내 소식과 내 태그 사이의 관계를 매핑하는 내 데이터베이스에서 세 번째 테이블 (라고 news_tag를) 만들었습니다. 태그가 뉴스에 자동으로 매핑됩니다.

내 문제는 입니다. 내 태그 테이블의 'name'필드가 고유합니다. 나는 정상적인 생각이다.

자, 두 개의 뉴스에 '11 월 '같은 태그가 추가되었습니다. . . 나는 유일한 키 제약의 위반을 얻을 것이다!

나는이 경우 Dotrine이 내 태그 테이블에 복제 된 태그를 삽입해서는 안된다고 생각했습니다.

이 경우 doctrine은 'tag'테이블에 태그를 삽입하지 않고 duplicate 태그의 관계 만 (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

당신이 직면하고있는 문제는 당신이 그렇게 Doctrine 시도는 다음을 지속하고, 모든 게시물에 대한 새로운 Tag 개체를 만드는 것입니다 데이터베이스가 귀하의 고유 한 제한 사항에 대해 불만을 제기합니다.

$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 월 '태그가있는 새 뉴스를 삽입하려고합니다. . . 나는 태그를 삽입하지 않았지만 그 뉴스를 태그 'novemeber'에 매핑해야합니다. . . news_tag라는 테이블을 업데이트 할 수 있습니까? – zm455

+0

내 제안 된 코드를 살펴보십시오. '11 월'태그를 찾아서 뉴스에 추가해야합니다. 또한, 그 태그에 뉴스를 추가하십시오. (내 코드에서는'$ persistedTag'라고합니다.) –

+0

미안하지만 내 태그 엔터티에 'news'라는 속성이 없습니다. 이것은 양방향 관계입니까? 해결책을 구현하려고합니다. 10 분 후에 나타납니다. – zm455

관련 문제