2011-03-18 5 views
1

힘든 시간을 내 머리에 감싸고 있습니다. 페이지 엔티티와 키워드 엔티티가 있습니다. "pages_keywords"라는 조인 테이블을 만드는 ManyToMany 연관이있는 내 페이지 엔티티에 $ keywords라는 멤버 변수를 만들었습니다. 내 응용 프로그램에서는 페이지에 키워드를 추가 할 수있는 기능을 제공하려고합니다. 레코드를 데이터베이스에 추가하는 방법은 무엇입니까?Doctrine 2 엔티티가없는 조인 테이블에 레코드를 추가하려면 어떻게합니까?

페이지 엔티티의 $ keywords 멤버 변수에 액세스 할 수 있지만 그 곳에서 어디로 갈지 잘 모르겠습니다. ArrayCollection의 Doctrine 구현에는 값을 취하는 add() 메소드가있다. Keyword 엔티티의 ID와 레코드를 생성 할 의지를 전달하면됩니까?

답변

4

당신이와 연관시킬 찾고있는 엔티티의 기본 키 값을 알고 가정 (당신의 예제를하는 $ keywordId),이 작업을 수행하는 가장 좋은 방법은 엔티티에 대한 참조를 얻는 것입니다. 이것은 연결된 엔터티에 대한 데이터베이스 조회를 수행하지 않고 참조를 가져옵니다.

후속 답변에 게시 한 솔루션에는 키워드 레코드를 검색하기 위해 데이터베이스를 추가로 이동해야하는 단점이 있습니다. 그것을 참조로 검색한다는 것은 여분의 데이터베이스 검색이 없다는 것을 의미합니다 :

<?php 

// assumes $this->em is already defined as the Doctrine2 EntityManager 
$page = $this->em->getRepository('App\Entity\Page')->find($pageId); 

// associate $keyword with $page via a reference to the keywordId 
$keyword = $this->em->getReference('App\Entity\Keyword', $keywordId); 
$page->getKeywords()->add($keyword); 
$em->flush(); 
+0

나는이 접근법을 정말 좋아하며 그것을 사용하기 시작할 필요가있다. –

1

나는 내 자신의 질문에 대해 여러 가지 이유로 대답하는 것 같습니다. :)

이 하나의 그림. 난 그냥 내 페이지 개체와 내가 그쪽으로 페이지에 추가하려는 키워드 개체를 잡아 다음 키워드를 가져오고 키워드 개체에 전달 add() 메서드를 사용하십시오.

// Assuming you have an instance of the Entity Manager 
$page = $this->em->getRepository('App\Entity\Page')->find($pageId); 
$keyword= $this->em->getRepository('App\Entity\Keyword')->find($keywordId); 
$page->getKeywords()->add($keyword); 
$em->persist($page); 
$em->flush();  
+1

이것은 좋지 않습니다. 데이터베이스에서 엔티티를 검색하고 있습니다. 실제로 하나의 참조 만 필요할 때입니다. $ em-> getReference가이를 수행하는 가장 좋은 방법입니다. – JCM

+0

그래, 나는 그걸 배웠어. 받아 들여진 대답과 저의 의견을보십시오. –

관련 문제