2013-01-04 3 views
15

Symfony2 프로젝트에는 두 개의 관련 엔티티 인 사용자 및 즐겨 찾기가 있습니다. 그들은 다 - 대 - 다 관계가 있습니다.Symfony2에서 많은 관계를 데이터베이스에 저장합니다.

내 응용 프로그램은 다음과 같이 작동합니다. 내 나뭇 가지 - 페이지에는 '즐겨 찾기에 추가'버튼이있는 몇 가지 항목이 있습니다. 단추를 클릭하면 내 컨트롤러가 item_id를 즐겨 찾기 열에 저장합니다. 그런데 을 즐겨 찾기에 추가 한 사용자를 저장하고 싶습니다. 여기에 내 애플리케이션이 실패합니다.

사용자와 즐겨 찾기가 있지만 사용자와 즐겨 찾기 사이의 joincolumn이 비어 있습니다. 나는 또한 어떤 종류의 오류도받지 않는다.

법인 사용자 당신이 가까웠다

public function showNewsAction() 
    { 
     $request = $this->get('request');  
     $itemId=$request->request->get('itemId'); 
     if($itemId != NULL) 
     { 
     //MAKE NEW FAVORITE AND ADD TO DATABASE LINKED WITH ITEM 
     $favorite = new Favorites(); 
     $favorite->setItemId($itemId); 

     //LINK FAVORITE ID WITH USER ID IN JOINCOLUMN 
     $userId = 6; 
     $em = $this->getDoctrine()->getEntityManager(); 

     $user = $em->getRepository('GeoCityTroopersBundle:Users')->find($userId); 

     $favorite->addUser($user); 
     $em->persist($favorite); 

     //I TRIED THIS TOO, BUT IT FAILED 
     /*$user->addFavorite($favorite); 
     $em->persist($user);*/ 

     $em->flush(); 
+0

... 실패 했습니까? 오류가 있거나 트릭을하지 않습니까? 오류가있는 경우 게시하십시오. – Pierrickouw

답변

23

class Users implements AdvancedUserInterface 
{ 
    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    * 
    * @ORM\ManyToMany(targetEntity="Favorites", inversedBy="user", cascade={"persist"}) 
    * @ORM\JoinTable(name="user_has_favorite", 
    * joinColumns={ 
    *  @ORM\JoinColumn(name="user_id", referencedColumnName="user_id") 
    * }, 
    * inverseJoinColumns={ 
    *  @ORM\JoinColumn(name="favorite_id", referencedColumnName="favorite_id") 
    * } 
    *) 
    */ 
    private $favorite; 

    public function __construct() 
    { 
     $this->favorite = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    public function addFavorite(\Geo\CityTroopersBundle\Entity\Favorites $favorite) 
    { 
     $this->favorite[] = $favorite; 

     return $this; 
    } 
... 

엔티티 즐겨 찾기

class Favorites 
{ 

    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    * 
    * @ORM\ManyToMany(targetEntity="Users", mappedBy="favorite", cascade={"persist"}) 
    */ 
    private $user; 

    public function __construct() 
    { 
     $this->user = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
    public function addUser(\Geo\CityTroopersBundle\Entity\Users $user) 
    { 
     $this->user[] = $user;  
     return $this; 
    } 

내 컨트롤러 :

여기 내 코드입니다. 교리 일대 다 관계에 대해 두 추가 메서드를 호출해야합니다.

$favorite->addUser($user); 
$user->addFavorite($favorite); 

$em->persist($favorite); 
$em->persist($user); 
$em->flush(); 

트릭을 수행해야합니다. the docs에서이 작업을 수행하지만 명시 적으로 언급하지는 않습니다. 왜 많은 사람들이이 문제에 빠지기 때문에 (나 자신이 포함되어 있는지) 확실하지 않습니다.

+0

댓글에서 "나는이 방법을 시도했지만 실패했습니다."라고 말했습니다. 다른 오류가있을 수 있습니다 ...실제로, 당신은 응답의 첫 번째 라인이 필수가 아니기 때문에 협회의 소유 측을 업데이트하면됩니다. – Pierrickouw

+0

내가 할 때 -> $ favorite-> addUser ($ user); $ user-> addFavorite ($ favorite); $ em-> persist ($ favorite); $ em-> persist ($ user); $ em-> flush(); 치명적인 오류 : 나는이 오류가 C에서가 아닌 객체의 멤버 함수의 이동()로 전화 : \ XAMPP \ htdocs를 \ Symfony13 라인 \ SRC \ 지오 \ CityTroopersBundle \ 법인 \ Users.php 나는 코드에서 살펴본 바 있는데, 나는 전혀 호출하지 않는 함수를 참조한다. –

+0

URL에서 양식을 만들 수있는 곳에서 문서에 대한 링크를 업데이트했습니다. – Dheeraj

0

좋아하지 many to many 관계에 대한 레코드를 추가하는 것은 한 방향으로 만 수행되며 관계를 정의하는 방법에 따라 달라집니다. 관계의 부모 개체 만 수행 할 수 있습니다, 그래서 당신의 경우에 당신은 사용해야합니다

$user->addFavorite($favorite); 
0

당신의 라인에서 :

@ORM\JoinColumn(name="favorite_id", referencedColumnName="favorite_id") 

name="favorite_id" 

부분은을 말한다 반면에 조인 테이블의 열은 0이됩니다.

referencedColumnName="favorite_id" 

은 일반적으로 단순히 "id"인 즐겨 찾는 테이블의 ID를 나타냅니다. 시도해야합니다 :

/** 
* @var \Doctrine\Common\Collections\ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="Favorites", inversedBy="user", cascade={"persist"}) 
* @ORM\JoinTable(name="user_has_favorite", 
* joinColumns={ 
*  @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
* }, 
* inverseJoinColumns={ 
*  @ORM\JoinColumn(name="favorite_id", referencedColumnName="id") 
* } 
*) 
*/ 
private $favorite; 
관련 문제