正确获取表单中的多对多实体

时间:2012-08-06 09:58:59

标签: symfony doctrine-orm many-to-many

我是symfony的新手,我环顾四周但是找不到问题的正确答案。

我有两个与多对多关系链接的实体。实体User - >实体FollowedUser。 一个User应该可以关注多个FollowedUser,一个FollowedUser应该有多个Users关注他。

我的问题是,当我尝试为FollowedUser列出所有User时,请说出我的CurrentUser,我得到的所有FollowedUser不仅仅是与CurrentUser相关联的src/MyBundle/Entity/User.php 1}}。

这是我的代码。

用户实体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',
        );
    }
}

用户类型

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

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

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

NB:我评论的线条是我发现做我想要的唯一方法。但它感觉不到正确的方法。

在我的控制器中:

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

编辑:

实际上我的问题是我在ManyToMany声明中忘记了一些注释。以下是应该用于单向ManyToMany关系的默认注释:

{{1}}

在此处的学说文档中找到了解决方案:doctrine2 unidirectionnal ManyToMany

1 个答案:

答案 0 :(得分:0)

  

如果指定,则用于查询选项子集(及其选项)   (应该用于该领域)。此选项的值可以   要么是QueryBuilder对象,要么是Closure。如果使用Closure,它   应该采用单个参数,即EntityRepository   实体。

如前所述,如果不指定query_builder Symfony 2选项,您将获得所有FollowedUser。含义:

 $builder->add('followedUsers');

类似于:

  1. 添加属性为followedUsers类的User的字段。
  2. 猜猜它是类型(entity类型)。
  3. query_builder选项未指定?然后获取所有用户
  4. 选择(取决于expandedmultiple选项)这些(选项)用户实际关注模型中的用户,同时取消选中所有其他(选项)用户。< / LI>

    所以,问题是:为什么你只想在表单模型中显示跟随用户的用户?这是没有意义的......应用程序的实际用户将永远无法添加新的关注用户。