我有像这样的实体
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'));
但我的选择列表现在是空的。
答案 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;
}