如何在 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
}
我正在使用 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
}