2016-07-07 4 views
1

엔티티의 새로운 레코드를 만들려면 Symfony가 있습니다 News. 속성 중 하나는 $newsArticle이며 엔티티 NewsArticle과 일대 다 관계가 있으며 뉴스 레코드의 번역본을 보유합니다. 양식에 새로운 News 레코드와 관련 NewsArticle 레코드 (표준 언어)를 한 번에 만들어야합니다. 관계가 @ORM 주석의 도움으로 올바르게 정의 이럴 :Symfony Form/Doctrine : 아직 보존되지 않은 엔티티의 외래 키 저장

class News { 
    // ... 

    /** 
    * @ORM\OneToMany(targetEntity="NewsArticle", mappedBy="news", cascade={"persist", "remove"}) 
    */ 
    protected $newsArticle; 

    // ... 

    /** 
    * Add newsArticle 
    * 
    * @param \Acme\Bundle\Entity\NewsArticle $newsArticle 
    * 
    * @return News 
    */ 
    public function addNewsArticle(\Acme\Bundle\Entity\NewsArticle $newsArticle) 
    { 
     $this->newsArticle[] = $newsArticle; 

     return $this; 
    } 
} 


class NewsArticle { 
    // ... 

    /** 
    * @ORM\ManyToOne(targetEntity="News", inversedBy="newsArticle") 
    * @ORM\JoinColumn(name="news_id", referencedColumnName="id") 
    */ 
    private $news; 
} 

문제는 : 양식을 전송 한 후 뉴스와 NewsArticle 레코드가 생성되지만, 필드 news_id에 값이 없습니다. (: 캐스 케이 딩 관계와 "역"쪽 저장 교리) 다 대다 관계를위한 솔루션 예 :

트릭을 나는 Symfony Docs에있는이 문제에 관해서는

각 "태그"에 단일 "작업"이 설정되어 있는지 확인하는 것입니다. 이 작업을 수행하는 쉬운 방법 중 하나는 by_reference가 false로 설정되어 있기 때문에 양식 유형이라고 addTag()에 몇 가지 추가 로직을 추가하는 것입니다

// src/AppBundle/Entity/Task.php 

// ... 
public function addTag(Tag $tag) 
{ 
    $tag->addTask($this); 

    $this->tags->add($tag); 
} 

태그 내부, 단지 수 있도록 당신이 addTask이 있는지 방법 : 당신은 단순히 addTag 내부에서 setTask를 호출 할 수있는 것을 제외하고는 일대 다 관계가있는 경우

// src/AppBundle/Entity/Tag.php 

// ... 
public function addTask(Task $task) 
{ 
    if (!$this->tasks->contains($task)) { 
     $this->tasks->add($task); 
    } 
} 

는 다음 해결 방법은 유사한 입니다. 불행하게도이 오류 메시지가 발생 ...

public function addNewsArticle(\Acme\Bundle\Entity\NewsArticle $newsArticle) 
{ 
    $newsArticle->setNews($this); 
    $this->newsArticle[] = $newsArticle; 

    return $this; 
} 

: 선택 필드에 전달

엔티티가 관리해야

따라서이 같은 내 코드를 확장했다. 엔티티 관리자에 을 지속 할 수 있습니까?

이 문제를 해결하는 방법을 모르겠다. 아무도 나에게 힌트를 줄 수 있니? 또는 아직 유지되지 않은 관련 엔터티를 만드는 더 나은 솔루션일까요?

미리 감사드립니다.

편집 : NewsController가 (발췌)

public function addAction(Request $request) { 

    $article = new NewsArticle(); 
    $article->setLanguageId($lang); 

    $news = new News(); 
    $news->setPublic(0); 
    $news->setDeleted(0); 
    $news->setIdent($hash); 
    $news->setRank($rank); 
    $news->addNewsArticle($article); 

    $form = $this->createForm(NewsType::class, $news, ['languageId' => $lang]); 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($news); 
     $em->flush(); 

     $this->addFlash(
      'success', 
      'Your changes were saved!' 
     ); 

    } 

    return $this->render('AcmeBundle:News:add.html.twig', array(
     'form' => $form->createView(), 
     'news' => $news, 
    )); 
} 
+0

동일한 요청으로 ID를 조작하려면 ID를 가져올 필요가 없습니다.Symfony와 Mongo를 사용하여 얻은 유일한 경험이 있습니다. 그 시점에서 참조로 사용할 수 있습니다. 계속 사용하기 전까지는 ID를 사용할 수 없습니다. – Simon

답변

0

보인다 I've는 문제를 해결하고 키우면 코드에 I've 내 질문에 있지만 FormType 코드에 게시 없습니다.

+0

코드를 게시 할 수 있습니까? 다른 사람들이 유사한 문제를 해결하는 데 도움이됩니다. – Tek

0

모든 엔티티를 지속한다면 그것은 더 나은 될 것입니다 :

$em = $this->getDoctrine()->getManager(); 
$em->persist([$news, $article]); 
$em->flush(); 

행운을 빕니다!