我想以Synfomy形式显示一个选择输入,该选择输入仅建议具有特定角色的用户。
我目前正在编写一个应用程序,其中涉及一些基本用户和一些负责基本用户的超级用户。
因此,每当我注册一个新用户时,我都希望能够将其分配给指定的“超级用户”,由该超级用户管理。
但是,当我尝试在我的registrationType中创建一个实体类型字段以选择要分配的超级用户时,我不知道如何仅显示具有ROLE_MANAGER选项的用户。我只了解如何显示所有用户。
所有用户都在同一表中。 我仅使用Symfony角色系统来区分它们。
我试图查看一个query_builder解决方案,但是我并没有了解如何使用“ where”参数查找数组或在该查询中应用角色层次结构。
我的formType如下。 我试图仅在“ manager” entityType select输入中显示角色为ROLE_MANAGER和更高级别的用户。
角色存储在这样的数组中:[“ ROLE_USER”,“ ROLE_MANAGER”,“ ROLE_ADMIN”] ...因此,user.roles返回此类数组。
class RegistrationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email')
->add('username')
->add('manager', EntityType::class,[
'class' => User::class,
'choice_label' => 'username',
'query_builder' => function (EntityRepository $er){
return $er->createQueryBuilder('u')
->orderBy('u.username', 'ASC');
}])
->add('password',PasswordType::class)
->add('confirm_password',PasswordType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
'validation_groups' => ['Default', 'registration'],
]);
}
}
有人能指出我正确的方向吗?
非常感谢!
答案 0 :(得分:1)
我认为用户角色存储在字符串数组中,这使得使用==
之类的查询变得更加困难。但是,您可以使用LIKE
运算符。这将寻找一个模式。在您的情况下,如果您只想向用户显示ROLE_MANAGER
,则可以使用:
->andWhere('u.roles LIKE \'%ROLE_MANAGER%\' ')
将此内容放在->orderBy('u.username', 'ASC');
上方的行中。
请注意::如果您还有其他包含ROLE_MANAGER
的角色,则将LIKE
与%
... {{1} }。您可以阅读有关sql LIKE运算符here的更多信息。
ps 。您可能想知道为什么我会使用%
而不是andWhere()
。这是习惯性的操作,因为where()
可以删除实际SQL查询中的先前where()
语句(如果有的话),因此我尝试避免使用它。并改用WHERE
。
答案 1 :(得分:0)
您应该在查询中对其进行精确调整(并尽量避免在代码中使用原始字符串):
//somewhere in your project
class User
{
const ROLE_MANAGER = 'ROLE_MANAGER'; //or in your config, parameters etc
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$role = User::ROLE_MANAGER;
// OR something like this if you think you gonna
// need to reuse this formtype with other roles restructions :
// $role = $options["role"];
//...
->andWhere(':role IN u.roles')
->setParameter('role', $role)
DQL的另一件很酷的事情是,它在标准SQL操作上添加了一些糖。 例如,在接近此用例的用例中,您可能需要使用“ MEMBER OF”关键字,使您可以搜索集合中的特定实体:
->andWhere(':manager MEMBER OF u.managedBy')
->setParameter('manager', $user)
希望有帮助!