Php 具有非活动记录的实体表单字段

Php 具有非活动记录的实体表单字段,php,symfony,symfony-forms,Php,Symfony,Symfony Forms,我有这样一个表单定义(用于演示): 这样可以确保在使用此表单时,只能在下拉字段中选择活动记录 这导致了这种情况:当我使用上面的表单定义编辑一个实体,并且该实体作为非活动EntityA分配时,它不会出现在下拉字段中。当我点击save按钮时,它将获得分配的第一个活动(如果有)EntityA。此外,表单还将向用户建议分配的实体与实际分配的实体不同 正确的方法是表单显示所有活动记录和当前分配的非活动记录 我查看了表单事件侦听器,但这似乎过于复杂。此外,仅仅为了编辑而扩展表单可能是一件事,但对我来说这似乎

我有这样一个表单定义(用于演示):

这样可以确保在使用此表单时,只能在下拉字段中选择活动记录

这导致了这种情况:当我使用上面的表单定义编辑一个实体,并且该实体作为非活动
EntityA
分配时,它不会出现在下拉字段中。当我点击save按钮时,它将获得分配的第一个活动(如果有)
EntityA
。此外,表单还将向用户建议分配的
实体与实际分配的实体不同

正确的方法是表单显示所有活动记录和当前分配的非活动记录

我查看了表单事件侦听器,但这似乎过于复杂。此外,仅仅为了编辑而扩展表单可能是一件事,但对我来说这似乎不是“正确的方式”


如何解决此问题,最好不使用第三方捆绑包?

获取对象并将不同的数据加载到下拉列表中,具体取决于操作类型:编辑/创建:

$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) 
{
    $data = $event->getData();
    $form = $event->getForm();

    $form ->add('field', 'entity', [
        'class' => EntityA::class,
        'query_builder' => function($repo) use ($data) {
             if ($data->getId()) {
                 // Edit mode: append the pre-selected record to dropdown
                 return $repo->createQueryBuilder('e')
                     ->andWhere('e.active = 1')
                     ->orWhere('e.id = :id')
                     ->setParameter('id', $data->getId());
              } else {
                 // Display only active records
                 return $repo->createQueryBuilder('e')->andWhere('e.active = 1');                          
              }  
          }
     ]);
});

如果我将此代码放入
buildForm
方法中,则对于
$object
,我总是得到
null
。此时执行时间太早。请在触发FormEvents::POST_SET_DATA Event事件时添加该字段(),谢谢。我结合使用了
PRE\u SET\u DATA
和自定义字段类型来扫描我的表单并更改
query\u builder
$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) 
{
    $data = $event->getData();
    $form = $event->getForm();

    $form ->add('field', 'entity', [
        'class' => EntityA::class,
        'query_builder' => function($repo) use ($data) {
             if ($data->getId()) {
                 // Edit mode: append the pre-selected record to dropdown
                 return $repo->createQueryBuilder('e')
                     ->andWhere('e.active = 1')
                     ->orWhere('e.id = :id')
                     ->setParameter('id', $data->getId());
              } else {
                 // Display only active records
                 return $repo->createQueryBuilder('e')->andWhere('e.active = 1');                          
              }  
          }
     ]);
});