在Symfony中使用查询生成器时遇到困难。 像这样,我的选择框列出了存储在我的实体“选项”中的所有数据:
$options['class'] = Options::class;
$options['choice_label'] = function ($value) {
return $value->getName();
};
$formBuilder->add($name, $class, $options);
但是我要过滤数据,以便选项仅显示连接到我的实体“字段”的特定ID的数据。
这是我使用查询生成器的方法:
$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 \ OptionsRepository,在 /用户/工作/项目/供应商/ symfony / doctrine-bridge /表格/类型/EntityType.php 在第32行
答案 0 :(得分:4)
让我们从EntityRepository
是位于下面的核心Doctrine存储库开始
Doctrine\ORM\EntityRepository;
名称空间。我也怀疑,您在项目中还有另一个EntityRepository
。
因此,第一个错误是错误的类型提示。您应该在控制器之前添加use Doctrine\ORM\EntityRepository;
。 OptionsRepository
符合此定义,因为它扩展了EntityRepository
,或者至少应该。
第二个错误是->setParameter(':id', $id)
-您不能将存储库设置为查询的参数,这是没有用的。我不知道什么是$id
,但与其他任何回调函数一样,您可以use
。
第三,由于选项名为query_builder
-您的回调应返回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);
};