Я полагаю, что неожиданное поведение происходит, потому что вы путаете использование типов полей формы Выбор и Сущность.
Вы указываете поле Entity (второй параметр в $ builder-> add ()), а затем пытаетесь заполнить его значениями, используя опцию 'choices'.Однако опция 'выборы' не может напрямую применяться к типу поля Entity , хотя, как говорят, она наследуется от Choice.Скорее, поле Entity предназначено для автоматической загрузки вариантов из базы данных для вас.Если вы устанавливаете только Entity 'class', поле заполняется всеми сущностями из таблицы в порядке возрастания первичного ключа.Чтобы загрузить подмножество сущностей и / или загрузить их в определенном порядке, вы можете установить функцию '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));
Запрос может быть как простым, так и сложным.См. Использование Doctrine's Query Builder .
Я подозреваю, что способ создания поля проекта в вопросе приводит к тому, что базовые варианты для раскрывающегося списка устанавливаются дважды - во-первых, когда классопция 'устанавливается для всех доступных объектов проекта, во-вторых, когда установлена опция' выборы ', к результату $ this-> getProjects ().Предположительно, если последний является пустым массивом, он не переопределяет первый и, следовательно, все проекты появляются в списке.
Если по какой-то причине вы не можете использовать построитель запросов, чтобы получить проекты для удалениязатем вы можете использовать тип поля Choice и вручную отобразить данные проектов в опцию 'choices'.Например, что-то вроде этого:
$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));
Обратите внимание, что в этом случае значение поля 'project' будет идентификатором Project, тогда как для поля Entity это будет фактическая сущность Project, которая является другойпричина, по которой предпочтительно использовать поле Entity.