EntityType的choice_value正在删除重复的值

时间:2016-09-29 11:21:03

标签: forms symfony

我正在尝试构建一个填充了数据库实体的select html元素。我需要从非默认实体值中选择select元素中的标签和值,因此我使用'choice_label'和'choice_value'选项。

问题是任何具有重复'choice_value'(区域)值的实体都被删除(替换?)。

这是我的表单构建器:

$builder->add('country', EntityType::class, array(
    'class' => 'AcmeCheckoutBundle:Country', 
    'label' => 'Country',
    'query_builder' => function(EntityRepository $er) {
        return $er->createQueryBuilder('c')
            ->orderBy('c.name', 'ASC');
    },
    'choice_label' => 'name',
    'choice_value' => 'territory'
));

这就是我的期望:

<select>
    <option value="1">United Kingdom</option>
    <option value="2">France</option>
    <option value="2">Germany</option>
    <option value="3">Brazil</option>
    <option value="3">Canada</option>
</select>

这就是我得到的:

<select>
    <option value="1">United Kingdom</option>
    <option value="2">Germany</option>
    <option value="3">Canada</option>
</select>

如果我从表单构建器中删除'choice_value',我会得到所有记录,但显然有错误的值。

1 个答案:

答案 0 :(得分:0)

ChoiceType的先前symfony3选择数组具有以下结构:

$choices = [
    'value1' => 'label1',
    'value2' => 'label2', ...
];

因此,当您使用元素填充此数组时,将覆盖具有重复值的元素。由于symfony2.7选择数组被重新编写,现在它具有反转结构:

$choices = [
    'label1' => 'value1',
    'label2' => 'value2', ...
];

现在您可以拥有重复值,但必须具有唯一标签。此结构是在symfony2.7中引入的,但默认情况下未启用,默认情况下在symfony3中使用。

要在symfony2.7中启用此结构,您可以使用选项choices_as_valueshttp://symfony.com/doc/2.7/reference/forms/types/choice.html#choices-as-values)。

实际上在EntityType symfony文档中没有提到这个选项,但是当EntityType扩展ChoiceType时它应该可以工作。如果不是,您可以使用ChoiceType而不是EntityType并手动提供选择。