如何在 select 上仅显示由 buildForm 为 ManyToOne 关联生成的特定记录

How to show on the select only specific records when it's generated by buildForm for ManyToOne association

我有这样的实体

class User implements UserInterface
{

    // ...

    /**
     * Many Departments have One Central Department (User)
     * @ORM\ManyToOne(targetEntity="User")
     */
    private $centralDepartment;

    // ...
}

具有自引用关联。在相关的 buildForm 中我使用

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
// ...
                ->add('centralDepartment');
// ...
    }
}

它在我的视图中创建了 select 列表和用户列表。没错。

但目标是仅在列表中显示具有特定角色的用户。如果 selected 用户具有特定角色,我还想在保存到数据库之前进行验证。

我应该使用 https://symfony.com/doc/3.4/reference/forms/types/choice.html 中的选项 choice_loader 还是在 Symfony 中有更好的选择?我试图首先使用

更改标签
->add('centralDepartment', ChoiceType::class, array('label' => 'Choose Central Department'));

但是我的 select 列表现在是空的。

首先尝试使用 EntityType 而不是 ChoiceType,后者是用于实体关系的更专业的 ChoiceType。

有了 EntityType,您有一个 query_builder 选项来 select 想要的选择。

参见:https://symfony.com/doc/current/reference/forms/types/entity.html#query-builder

这也可以通过带有 ChoiceTypechoice_loader 选项来实现,但需要更多的工作。

根据@Joe 的建议,我使用了 EntityType

->add('centralDepartment', EntityType::class, array(
                    'class' => 'AppBundle:User',
                    'query_builder' => function(UserRepository $er) {
                            return $er->findAllBC(true);
                        }   
            ));

其中 findAllBC(true) 是我在 UserRepository 中用于 return Query Builder 对象的方法,其中包括供我使用的特定用户:

public function findAllBC($returnQB = false)
{
    $qb = $this->createQueryBuilder('u')
        ->andWhere('u.roles LIKE :role')
        ->setParameter('role', '%BC%');

    if(!$returnQB) return $qb->getQuery()->execute();
    else return $qb;
}