我正试图找出用实体中的数据加载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));
;