2011-06-12 72 views
3

我使用FOSUserBundle,在我的User類我想兩件事情:2 many2many自引用集合

  1. 用戶可以邀請朋友的其他用戶。朋友必須確認這種友誼。爲此,用戶有兩個屬性$inviteeForFriends$invitedFriends這是一個many2many自引用協會來管理掛起的友誼

  2. 如果友誼被確認它是從pendingfriendship assoc命令刪除並添加到友誼assoc命令:$myFriends$friendsWithMe這也是一個很多的自引用關聯。

現在在控制器我這樣做:

public function addAction() { 
    $email = trim($this->get('request')->request->get("email")); 
    // ... 

    // find requested friend 
    $userManager = $this->get('fos_user.user_manager'); 
    $friend = $userManager->findUserByEmail($email); 
    // ... 
    $user = $this->container->get('security.context')->getToken()->getUser(); 

    // ... 

    // friend has not already asked the user 
    if ($user->getInviteeForFriends()->contains($friend)) { 
      throw new Exception(self::FRIEND_HAS_ALREADY_ASKED_MSG, self::FRIEND_HAS_ALREADY_ASKED); 
    } 
} 

在此錯誤最終結果的$user->getInviteeForFriends()->contains($friend)

Notice: Undefined index: $invitedFriends in /home/r/workspace/MyProject/vendor/doctrine/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 764

一個echo get_class($user->getInviteeForFriends())回聲一個Doctrine\ORM\PersistentCollection。 A echo $user->getInviteeForFriends()->count();導致相同的未定義索引錯誤。

這些語句的工作:

$user->getMyFriends()->contains($friend) 
$user->getInvitedFriends()->contains($friend) 

$user->getInviteeForFriends()->contains($friend)沒有。爲什麼?我究竟做錯了什麼?

,這是用戶類的一部分:

/** 
* @ORM\Entity 
* @ORM\Table(name="fos_user") 
*/ 
class User extends BaseUser 
{ 
/** 
* @ORM\ManyToMany(targetEntity="User", mappedBy="myFriends") 
*/ 
protected $friendsWithMe; 

/** 
* @ORM\ManyToMany(targetEntity="User", inversedBy="friendsWithMe") 
* @ORM\JoinTable(name="friends", 
*  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="friend_user_id", referencedColumnName="id")} 
*) 
*/ 
protected $myFriends; 


/** 
* I am invited for a friendship from these friends. 
* 
* @ORM\ManyToMany(targetEntity="User", mappedBy="$invitedFriends") 
*/ 
protected $inviteeForFriends; 

/** 
* I invited those friends for a friendship. 
* 
* @ORM\ManyToMany(targetEntity="User", inversedBy="$inviteeForFriends") 
* @ORM\JoinTable(name="pending_friendships", 
*  joinColumns={@ORM\JoinColumn(name="inviter_user_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="invitee_user_id", referencedColumnName="id")} 
*) 
*/ 
protected $invitedFriends; 

public function __construct() 
{ 
    parent::__construct(); 
    $this->friendsWithMe = new \Doctrine\Common\Collections\ArrayCollection(); 
    $this->myFriends = new \Doctrine\Common\Collections\ArrayCollection(); 
    $this->inviteeForFriends = new \Doctrine\Common\Collections\ArrayCollection(); 
    $this->invitedFriends = new \Doctrine\Common\Collections\ArrayCollection(); 
} 


/** 
* Add friendsWithMe 
* 
* @param MyProject\SiteBundle\Entity\User $friendsWithMe 
*/ 
public function addFriendsWithMe(\MyProject\SiteBundle\Entity\User $friendsWithMe) 
{ 
    $this->friendsWithMe[] = $friendsWithMe; 
} 

/** 
* Get friendsWithMe 
* 
* @return Doctrine\Common\Collections\Collection $friendsWithMe 
*/ 
public function getFriendsWithMe() 
{ 
    return $this->friendsWithMe; 
} 

/** 
* Add myFriends 
* 
* @param MyProject\SiteBundle\Entity\User $myFriends 
*/ 
public function addMyFriends(\MyProject\SiteBundle\Entity\User $myFriends) 
{ 
    $this->myFriends[] = $myFriends; 
} 

/** 
* Get myFriends 
* 
* @return Doctrine\Common\Collections\Collection $myFriends 
*/ 
public function getMyFriends() 
{ 
    return $this->myFriends; 
} 

/** 
* Add inviteeForFriend 
* 
* @param MyProject\SiteBundle\Entity\User $inviteeForFriend 
*/ 
public function addInviteeForFriends(\MyProject\SiteBundle\Entity\User $inviteeForFriend) 
{ 
    $this->inviteeForFriends[] = $inviteeForFriend; 
} 

/** 
* Get inviteeForFriends 
* 
* @return Doctrine\Common\Collections\Collection $inviteeForFriends 
*/ 
public function getInviteeForFriends() 
{ 
    return $this->inviteeForFriends; 
} 

/** 
* Add invitedFriend 
* 
* @param MyProject\SiteBundle\Entity\User $invitedFriend 
*/ 
public function addInvitedFriends(\MyProject\SiteBundle\Entity\User $invitedFriend) 
{ 
    $this->invitedFriends[] = $invitedFriend; 
} 

/** 
* Get invitedFriends 
* 
* @return Doctrine\Common\Collections\Collection $invitedFriends 
*/ 
public function getInvitedFriends() 
{ 
    return $this->invitedFriends; 
} 
} 
+1

在註釋'$ inviteeForFriends'應該只是'inviteeForFriends'。沒有美元符號。 – igorw 2011-06-12 15:13:50

回答

2

在註釋$inviteeForFriends應該只是inviteeForFriends。沒有美元符號。它從不在註釋中。

也看不到任何的例子from the doctrine orm 2.0 documentation

/** @Entity */ 
class Feature 
{ 
    // ... 
    /** 
    * @ManyToOne(targetEntity="Product", inversedBy="features") 
    * @JoinColumn(name="product_id", referencedColumnName="id") 
    */ 
    private $product; 
    // ... 
}