私は、選択肢とエンティティのフォームフィールドタイプの使用を混同しているため、予期しない動作が発生していると思います。
エンティティフィールド($ builder-> add()の2番目のパラメータ)を指定し、 'choices'オプションを使用して値を入力しようとしています。しかし、「選択肢」オプションは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を参照してください。
質問でプロジェクトフィールドを作成する方法は、ドロップダウンの基本的な選択肢が2つに設定されていると思われます。最初に 'class'オプションが設定されている場合は、 'choices'オプションが$ this-> getProjects()の結果に設定されます。おそらく後者が空の配列であれば、前者をオーバーライドしないので、すべてのプロジェクトがリストに表示されます。
何らかの理由でクエリービルダーを使用してドロップダウンのプロジェクトを取得できない場合は、「選択肢」フィールドタイプを使用してプロジェクトデータを手動で「選択肢」オプションにマップできます。例えば、このような何か:エンティティのフィールドのために、それは別の理由で実際のプロジェクトのエンティティになります一方、この場合には「プロジェクト」フィールドの値は、プロジェクトIDになること
$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));
注意エンティティフィールドを使用することが望ましいです。
このリストにはどんなものがありますか?値が設定されても同じではありませんか? – AlterPHP