Symfony 3 - EntityType - 呈现数据库值

时间:2017-11-09 14:05:17

标签: php symfony symfony-3.3

我在Symfony 3中使用formType中的EntityType。 当我以新的形式显示它时,一切都很好,choicetype liste包含我数据库中的所有值。 但是当我从我的数据库加载现有数据时,选择列表不会从数据库加载值,它会显示placeholer。 我已经检查了数据库并保存了值。 我的表单看起来像这样

->add('tester', EntityType::class, array(
                'class' => 'MyBundle:TesterList',
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('u')
                    ->orderBy('u.name', 'ASC');
                },
                'choice_label' => 'name',
                'choice_value' => 'name',
                'required' => true,
                'placeholder' => 'Select a tester',
                ))

为了测试我尝试将EntityType更改为列表为2的ChoiceType,它完美地运行。 我不知道EntityType有什么问题。

编辑: 该字段以我的形式显示:

 {{ form_label(formHydraulicTest.testHeader.tester,'Tester' | trans) }}
 {{ form_widget(formHydraulicTest.testHeader.tester) }} 

实体TesterList与其他实体没有任何关系。它只是一个名单。

当我尝试保存它时,EntityType返回一个TesterList对象,所以我在TesterList实体中添加了这个函数。

public function __toString() {
    return $this->name;
}

有了这个,我只保存了测试人员的名字而不是实体的链接。

2 个答案:

答案 0 :(得分:0)

通用EntityRepository可能不知道通过创建命名的QueryBuilder'u'来获取哪些实体。您可能需要实际的TesterList存储库。所以你的代码看起来像这样:

->add('tester', EntityType::class, array(
                'class' => 'MyBundle:TesterList',
                'query_builder' => function (TesterListRepository $er) {
                    return $er->createQueryBuilder('u')
                              ->orderBy('u.name', 'ASC');
                },
                'choice_label' => 'name',
                'choice_value' => 'name',
                'required' => true,
                'placeholder' => 'Select a tester',
                ))

当然,将TesterListRepository添加到表单类顶部的use语句中。

答案 1 :(得分:0)

我发现了一种方法可以使它工作,我只需用twig选择默认值。我已经像这样更新了它

 {{ form_label(formHydraulicTest.testHeader.tester,'Tester' | trans) }}
                    {{ form_widget(formHydraulicTest.testHeader.tester, { value : formHydraulicTest.testHeader.vars.value.tester}) }} 

我不确定这是解决我的问题的最佳方法,但它有效;)