我想让用户中的所有管理员(即具有ROLE_ADMIN角色)。
属性角色是“ json”,所以我认为我不能使用“ like”或“ =”运算符。
我在symfony4项目中使用MakerBundle实现了用户管理(make:user然后make:auth命令)。
selectedId
当我在控制器中调用class User implements UserInterface
{
/**
* @ORM\Column(type="json")
*/
private $roles = [];
}
class UserRepository extends ServiceEntityRepository
{
public function findByRole($role){
return $this->createQueryBuilder('u')
->where("u.roles like :role ")
->setParameter('role', '%'.$role.'%')
->getQuery()
->getResult();
}
}
class MyController extends AbstractController
{
public function edit(UserRepository $userRepository): Response
{
$admins = $userRepository->findByRole('ROLE_ADMIN');
dump($admins);
exit;
}
}
时,错误消息是:
findByRole('ROLE_ADMIN')
我还尝试使用scienta / doctrine-json-functions(https://packagist.org/packages/scienta/doctrine-json-functions),但无法修复。
答案 0 :(得分:0)
我找到的解决方案基于https://www.remipoignon.fr/symfony-comment-verifier-le-role-dun-utilisateur-en-respectant-la-hierarchie-des-roles/(对不起,这是一篇法国文章)
我创建了GrantedService,然后在我的控制器中:
public function edit(UserRepository $userRepository){
foreach($userRepository->findAll() as $user){
if( $grantedService->isGranted($user, 'ROLE_ADMIN') ){
//do something...
}
}
}
对于我当前的用户很少的项目,可以。但是我还有其他具有数千个用户的项目,我知道findall()然后测试全部不是一个好习惯。所以稍后我将不得不解决此问题