Symfony 3.4,表单生成器中的query_builder给出错误:“必须管理传递给选择字段的实体。也许将它们持久保存在实体管理器中”

时间:2018-07-12 23:23:56

标签: symfony symfony-3.4

我想我一定很想念东西。我正在尝试使用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实体的工作即可。哇。

0 个答案:

没有答案