如何在Symfony 4中将queryBuilder与formBuilder一起使用?

时间:2019-03-15 07:44:00

标签: php symfony oop query-builder formbuilder

在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行

1 个答案:

答案 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);
};