我想我一定很想念东西。我正在尝试使用Symfony 3.4建立实体的选择类型表单字段。具体地说,该表格是针对“财产”的,该财产具有从人员列表中选择的所有者。使用Symfony时,最令人沮丧的方面肯定是尝试自定义表单中的列表。
我将其添加到构建器中
->add('owner', EntityType::class, array(
'class' => 'AppBundle\Entity\People',
'label' => 'Owner',
'query_builder' => function(BusinessRepository $repo) {
return $repo->createBusinessPeopleQueryBuilder();
}))
,然后在该FormType类文件中指定存储库:
use AppBundle\Repository\BusinessRepository;
但是,访问路线时出现错误:
Type error: Argument 1 passed to
AppBundle\Form\PropertyFormType::AppBundle\Form\{closure}() must be an
instance of AppBundle\Repository\BusinessRepository, instance of
octrine\ORM\EntityRepository given
研究表明,问题是BusinessRepository缺少使用声明,但肯定存在。该功能是否存在于存储库中没有关系,因为它永远不会到达。无论是否使用了use语句,我都会遇到相同的错误。
有什么建议吗?这真令人沮丧。我还尝试通过将一组人作为选项传递来获得此列表,但是采用这种方法,我收到了有关传递给选择字段的非托管实体的错误。也没有运气弄清楚那个。
更新:我对代码进行了重新设计,以使它不会调用存储库中的函数:
->add('owner', EntityType::class, array(
'class' => 'AppBundle\Entity\People',
'label' => 'Owner',
'query_builder' => function(EntityRepository $em) use ($options) {
$qb = $em->createQueryBuilder('people');
$qb->select('p')
->from('AppBundle\Entity\People', 'p')
->from('AppBundle\Entity\Business', 'b')
->where('p.business = b')
->where('p.business = :business')
->orderBy('p.last_name', 'ASC')
->setParameter('business',$options['business']);
return $qb;
}))
这可以检索人员列表。但是,现在我又回到了原来的错误状态:
Entities passed to the choice field must be managed. Maybe persist them in
the entity manager
已解决:在我的控制器中,我正在为所有者创建一个新的人员,并将其传递给表单。删除创建新的People实体的工作即可。哇。