当buildForm为ManyToOne关联

时间:2018-01-11 10:51:17

标签: symfony entity formbuilder symfony-3.3

我有像这样的实体

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');
// ...
    }
}

并在我的视图中创建包含用户列表的选择列表。这是对的。

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

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

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

但我的选择列表现在是空的。

2 个答案:

答案 0 :(得分:1)

首先尝试使用EntityType代替ChoiceType,这是实体关系的更专业的ChoiceType。

使用EntityType,您可以选择query_builder选项。

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

这也可以通过choice_loader选项与ChoiceType实现,但需要更多工作。

答案 1 :(得分:0)

通过@Joe建议我使用了EntityType

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

其中findAllBC(true)是我在UserRepository中的方法,用于返回包含特定用户的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;
}