如何在 Symfony 中添加包含外键的下拉字段?

How do I add a dropdown field containing foreign keys in Symfony?

我正在使用 PHP/Symfony 进行编码,其中我有预算和收入关系。

Income 实体包含一个 id(整数)、name(字符串)、amount(整数)和一个外键(指向 Budget 实体):

// Income.php

#[ORM\ManyToOne(targetEntity: 'Budget', inversedBy: 'incomes')]
#[ORM\JoinColumn(name: 'budget_id', referencedColumnName: 'id', nullable: 'false')]
private $budget;

...

/**
* @param mixed $budget
*/
public function setBudget(Budget $budget): void
{
  $budget->addIncome($this);
  $this->budget = $budget;
}

我使用 FormBuilderInterface 创建了一个完整的表单,其中包含两个字段(名称和金额)。我可以保存和编辑创建的数据。

我的问题是如何向包含预算实体数据的表单(参见下面的代码)添加外键下拉字段?因此,例如,如果我创建了两个预算“2021”和“2022”,那么我想让这两个预算出现在下拉字段中。我尝试了下面的解决方案,但随后收到此错误消息:Can't get a way to read the property "budget" in class "App\Entity\Income"

class IncomeFormType extends AbstractType
{
  public function buildForm(FormBuilderInterface $builder, array $options): void
  {
    $builder
      ->add('name')
      ->add('description')
      ->add('amount')
      ->add('budget', ChoiceType::class, ['choice_filter' => 'isSelectable'])
    ;
  }

谢谢

您需要使用实体形式 class 而不是选择一:

class IncomeFormType extends AbstractType
{
  public function buildForm(FormBuilderInterface $builder, array $options): void
  {
    $builder
      ->add('name')
      ->add('description')
      ->add('amount')
      ->add('budget', EntityType::class, [
        'class' => Budget::class,
        'choice_filter' => 'isSelectable',
      ])
    ;
  }

如果您需要在列表中使用某些字段来代表您的实体,您应该将 choice_label 选项添加到与预算 class 中相应字段相关的字段中。

同时考虑使用 query_builder 选项来过滤适当实体的列表,而不是使用 choice_filter。它将减少内存使用并提高应用程序的性能。 query_builder 示例:

'query_builder' => function (EntityRepository $er) {
    return $er->createQueryBuilder('b')
        ->where('b.isSelectable = true') // if it is just field in DB or you can use any condition here
        ->orderBy('b.name', 'ASC'); // also help you ordering your entities in right order
}