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

Entity form field with inactive records

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

$builder->add('field', 'entity', [
    'class' => EntityA::class,
    'query_builder' => function($repo) {
        return $repo->createQueryBuilder('e')
            ->andWhere('e.active = 1');
    }
]);

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

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

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

我查看了表单事件侦听器,但这似乎过于复杂。另外,扩展表单只是为了编辑可能是一回事,但对我来说似乎不是 "the right way"。

如何解决这个问题,最好不使用第 3 方捆绑包?

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

$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');                          
              }  
          }
     ]);
});