Php 如何在Symfony 4中使用带有formBuilder的queryBuilder?
我在Symfony中使用查询生成器时遇到困难。 与此类似,我的选择框列出了存储在我的实体“选项”中的所有数据: 但我想过滤数据,以便选项仅显示连接到实体“字段”的特定id的数据 这是我使用查询生成器的方法:Php 如何在Symfony 4中使用带有formBuilder的queryBuilder?,php,symfony,oop,query-builder,formbuilder,Php,Symfony,Oop,Query Builder,Formbuilder,我在Symfony中使用查询生成器时遇到困难。 与此类似,我的选择框列出了存储在我的实体“选项”中的所有数据: 但我想过滤数据,以便选项仅显示连接到实体“字段”的特定id的数据 这是我使用查询生成器的方法: $options['class'] = Options::class; $options['choice_label'] = 'id'; $options['query_builder'] = function (EntityRepository $id) { return $thi
$options['class'] = Options::class;
$options['choice_label'] = 'id';
$options['query_builder'] = function (EntityRepository $id) {
return $this->createQueryBuilder('f')
->leftJoin('f.fields', 'fi')
->where(":id MEMBER OF f.fields")
->setParameter(':id', $id)
->getQuery()
->execute();
};
我收到的错误消息是:
参数1传递给
App\Controller\PagesController::App\Controller{closure}()必须是
App\Controller\EntityRepository的实例,的实例
App\Repository\options给定存储库,已调用
/Users/work/project/vendor/symfony/doctrine bridge/Form/Type/EntityType.php
第32行
让我们从一个事实开始,
EntityRepository
是一个正在开发的核心理论库
条令\ORM\EntityRepository代码>名称空间。我也怀疑你的项目中是否还有另一个实体报告
所以,第一个错误是错误的类型提示。您应该添加使用条令\ORM\EntityRepository代码>在控制器之前<代码>选项存储库
将符合此定义,因为它扩展了实体存储库
,或者至少它应该
第二个错误是->setParameter(':id',$id)
-您不能将存储库设置为查询的参数,它是无用的。我不知道什么是$id
,但与任何其他回调函数一样,您可以使用它
第三,由于选项名为QueryBuilder
,您的回调应该返回QueryBuilder
,所以删除->getQuery()->execute()代码>
最后,适当的代码应为:
use Doctrine\ORM\EntityRepository;
//....
$options['query_builder'] = function (EntityRepository $er) use ($id) {
return $er->createQueryBuilder('f')
->leftJoin('f.fields', 'fi')
->where(":id MEMBER OF f.fields")
->setParameter(':id', $id);
};
更改typehint?您是否已将EntityRepository导入到包含该表单的类中?谢谢,这在混乱中对我帮助很大。我照你的建议做了。我现在仍然有一个错误类型为“条令\ORM\QueryBuilder”,“数组”的预期参数给定
我必须找出解决方法,并在解决问题后立即通知您我必须删除最后两行->getQuery()->execute()代码>然后它就成功了!
use Doctrine\ORM\EntityRepository;
//....
$options['query_builder'] = function (EntityRepository $er) use ($id) {
return $er->createQueryBuilder('f')
->leftJoin('f.fields', 'fi')
->where(":id MEMBER OF f.fields")
->setParameter(':id', $id);
};