从实体加载Symfony Form实体类型


Load Symfony Form Entity type from Entity

我正试图找出用实体中的数据加载Symfony表单实体类型的正确方法。

我拥有的实体是User和School。

用户是指可以访问应用程序的任何人。但用户可以是School.principal、School.contact或School.admin

现在说我以管理员身份登录,我想添加另一所学校。在展示新的学校表格时,我希望有一个下拉列表,显示该管理员学校的所有现有联系人。

School.contact是一个用户实体,与School类似。校长兼学校管理员

我不知道如何为表单生成器创建QueryBuilder。我需要查询所有登录用户的学校,并为每个学校调出School.contact。我正努力在Symfony找到正确的方法。

在表单生成器中,我正在进行此操作。

->add('contact', EntityType::class, array(
                'label'=>'Contact',
                'class'=>'MySecurityBundle:User',
                'query_builder'=>function(EntityRepository $er) use ($userid) {
                    return $er->getContacts($userid);
                }
            ))

在MySecurityBundle:User中,我定义了getContacts。

 public function getContacts($userid) {
        $schools = $this->getEntityManager()->getRepository('MySchoolBundle:School')->findById($userid);
        $uids = array();
        foreach ($schools as $p) {
            $uids[] = $p->getContact()->getId();
        }
        return $this->getEntityManager()->createQueryBuilder()
            ->select('c')
            ->from('MySecurityBundle:User', 'c')
            ->where('c.id IN (:ids)')
            ->setParameter('ids', $uids)
        ;
    }

我似乎应该能够进行连接,而不是拉取所有的学校并获取联系人ID来导入查询。所有的联接示例似乎都是用同一个表联接的。我看不出有多少人会加入其他桌子。我可以用DQL做我想做的事情,但我不确定如何从DQL到表单构建实体类型期望看到的QueryBuilder。

但也许我只是完全错误地处理了这个问题。感觉我做得不对,但我的大脑卡住了。

我想你不会在用户身上引用他是什么类型的用户,或者他可以是多个。据我所知,你可能想要一些类似的东西?

    return $this->getEntityManager()->createQueryBuilder()
        ->select('sc.contact') //you can add 'c.name' etc but you need to select something from the base table which is school
        ->from('MySchoolBundle', 'sc')
        ->join('sc.contact', 'c')
        ->join('sc.admin', 'a')
        ->where('a.id = :id')
        ->setParameter(array('id' => $adminId));
    ;