2012-08-06 52 views
2

我是symfony的新手,我環顧四周,但沒有找到正確的答案來解決我的問題。正確獲取多對多實體

我有兩個實體鏈接多對多的關係。實體User - >實體FollowedUser。 一個User應該能夠跟隨幾個FollowedUser和一個FollowedUser應該有幾個Users誰跟着他。

我的問題是,當我嘗試列出所有FollowedUser一個User,說我的CurrentUser,我得到的不僅是那些所有FollowedUser關聯到我的CurrentUser

這是我的代碼。

用戶實體src/MyBundle/Entity/User.php):

namespace MyBundle\Entity; 

use FOS\UserBundle\Entity\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="My_user") 
*/ 
class User extends BaseUser 

    // ... 

    /** 
    * @var FollowedUser[] $followedUsers 
    * 
    * @ORM\ManyToMany(targetEntity="MyBundle\Entity\FollowedUser") 
    */ 
    private $followedUsers; 

    // ... 

    public function getFollowedUsers() 
    { 
     return $this->followedUsers; 
    } 
} 

用戶類型

namespace MyBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 
use MyBundle\Entity\FollowedUserRepository; 

class UserType extends AbstractType 
{ 

    public function buildForm(FormBuilder $builder, array $options) 
    {   
     $builder->add('followedUsers'); // This shows me the whole table 
     //,'entity' , array('class' => 'MyBundle\Entity\FollowedUser', 
     //    'multiple' => true, 
     //     'query_builder' => function(FollowedUserRepository $followedUserRepo) use ($options) { 
     //           $followedUsers = $options['data']->getFollowedUsers(); 
     //           $choices = array(); 
     //           foreach ($followedUsers as $followedUser){ 
     //            $choices[] = $followedUser->getId(); 
     //           } 
     //           $qb = $followedUserRepo->createQueryBuilder('u'); 
     //           $qb->select('u') 
     //           ->where($qb->expr()->in('u.id',$choices)); 
     //           return $qb; 
     //          }   
     //  )); 
    } 

    public function getName() 
    {   
     return 'followedUser'; 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => 'MyBundle\Entity\User', 
     ); 
    } 
} 

注:的I註釋行是我發現做我想做什麼的唯一方式。但它並不覺得正確的做法。

在我的控制器:

$currentUser = $this->container->get('security.context')->getToken()->getUser(); 

$followedUsers = $currentUser->getFollowedUsers(); // That works properly 

$form = $this->createForm(new UserType(),$currentUser); 

編輯:

其實我的問題是,我忘了在我的多對多聲明一些註解。這裏是一個應該被用於一個unidirectionnal多對多關係的默認註釋:

/** 
* @ManyToMany(targetEntity="Group") 
* @JoinTable(name="users_groups", 
*  joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@JoinColumn(name="group_id", referencedColumnName="id")} 
*  ) 
*/ 

解決方案在這裏學說文檔中找到:doctrine2 unidirectionnal ManyToMany

回答

0

如果指定,則用於查詢應該用於字段的選項子集(及其 順序)。該選項的值可以是 或者是QueryBuilder對象或Closure。如果使用Closure,則它應該採用一個參數,即 實體的EntityRepository。

不指定query_builder Symfony的2選項,你會得到所有FollowedUser,如你所說。的含義:

$builder->add('followedUsers'); 

是一樣的東西:

  1. 添加一個字段,它的屬性是UserfollowedUsers
  2. 猜猜它是什麼類型(entity類型)。
  3. query_builder選項未指定?然後取所有用戶
  4. 選擇(取決於expandedmultiple選項)這些(選項)用戶實際上跟隨模型中的用戶,使所有其他(選項)用戶不被選中。

所以,你的問題是:爲什麼你只想顯示用戶在表單模型中的用戶?這是沒有道理的......應用程序的實際用戶將永遠無法添加新的下列用戶。

+0

Thx爲您的答案。其實我不希望用戶能夠添加新的下列用戶。我想爲每個跟隨的用戶顯示一個獨特的'