2013-01-04 15 views
15

私のSymfony2プロジェクトには、2つの関連エンティティ、すなわちユーザとお気に入りがあります。彼らは多対多の関係を持っています。Symfony2のデータベースへの多対多リレーションシップ

私のアプリケーションは次のように動作します: 私のTwigページには、「お気に入りに追加」ボタンが付いたアイテムがいくつかあります。ボタンをクリックすると、マイコンは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; 
    } 

マイコントローラ:

は、ここに私のコードです。 doctrineの多対多リレーションシップでは、両方のaddメソッドを呼び出す必要があります。

$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で非オブジェクトのメンバ関数move()の呼び出し:\ xamppの\ htdocsに\ Symfony13ライン上の\ SRC \ジオ\ CityTroopersBundle \エンティティ\ Users.php 私はコードを見ましたが、私はまったく呼び出さない関数を指しています。 –

+0

URLからフォームを作ることができるものから、ドキュメントへのリンクを更新しました – Dheeraj

0

好きではありません多対多の関係のレコードを追加することは、一方向のみで行われ、関係の定義方法によって異なります。関係の親エンティティによってのみ行うことができますので、あなたの場合には、あなたが使用する必要があります。

$user->addFavorite($favorite); 
0

をあなたの行では:

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

name="favorite_id" 

部分が参照します一方、結合テーブルの列は、

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; 
関連する問題