我相信意外的行为发生,因为你是混合起来使用选择与实体形式的字段类型。
您指定的实体领域(第二个参数$ builder-> Add()方法),然后尝试与使用“选择”选项值来填充它。然而,“选择”选项并不直接适用于Entity field type,虽然它被认为是从Choice继承而来。相反,实体字段旨在为您自动从数据库加载选项。如果您只设置了实体“类”,则该字段将按照升序主键顺序与表中的所有实体一起填充。为了加载一个实体子集和/或以特定的顺序加载它们,你可以设置一个'query_builder'函数。
例如,创建升序名称为了所有国家的下拉列表:
$builder->add('country',
'entity',
array('class' => 'My\Bundle\Entity\Country',
'property' => 'name',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('country')
->orderBy('country.name', 'ASC');
},
'required' => true,
'empty_value' => false));
根据需要查询可以是简单或复杂。见Using Doctrine's Query Builder。
我怀疑在问题中创建项目字段的方式会导致将下拉列表的基础选项设置两次 - 首先是在设置了“类”选项时,指向所有可用的项目实体,其次是何时'选项'选项设置为$ this-> getProjects()的结果。假设后者是一个空阵列,它不会覆盖前者,因此所有项目都会出现在列表中。
如果由于某种原因,你不能使用查询生成器来获得下拉这时你可以手动使用一个选择字段类型和映射项目的数据为“选择”选项项目。例如,像这样:
$builder = $this->createFormBuilder();
$projects = $this->getProjects();
$projectChoices = array();
foreach ($projects as $project) {
$key = $project->getId();
$value = $project->getName();
$projectChoices[$key] = $value;
}
$builder->add('project',
'choice',
array('choices' => $projectChoices,
'required' => false));
注意,在这种情况下,“项目”字段的值将是一个项目的ID,而实体的领域将是一个实际的项目实体,这是另一个原因最好使用实体字段。
那你想在这个列表中得到什么?当一个值被设置时它不一样吗? – AlterPHP 2012-02-28 09:07:10