Symfony项目按roles查询用户列表无返回结果问题求助
问题根因
你代码的核心错误出在控制器中roles字段的查询条件写法完全不符合Doctrine JSON类型的查询规则:
- 你在User实体中定义roles字段为
json类型,Doctrine会自动处理该字段的序列化/反序列化:PHP层面操作的是数组格式,存入数据库时会自动转为JSON字符串,查询时也需要你传入PHP数组格式的匹配值,而非你写的嵌套JSON字符串的数组array('["ROLE_ADMIN"]') - 另外默认Symfony用户体系中,所有用户都会默认携带
ROLE_USER角色,也就是说管理员用户的roles在数据库中实际存储的是["ROLE_USER","ROLE_ADMIN"],你用完全等值匹配["ROLE_ADMIN"]的逻辑本身就查不到符合条件的用户。
修复方案
方案1:仅当你的系统中管理员角色没有其他附加角色时使用
直接修改控制器中的查询条件,传入正确的PHP数组格式:
$Admins=$this->getDoctrine()->getRepository(User::class)->findBy(['roles' => ['ROLE_ADMIN']]);
方案2:通用方案(推荐,支持查询包含指定角色的所有用户)
需要自定义查询逻辑,利用数据库的JSON包含函数实现筛选:
- 首先在你的
UserRepository中新增查询方法:
public function findUsersByRole(string $role) { return $this->createQueryBuilder('u') // 对应MySQL的JSON_CONTAINS函数,其他数据库可替换为对应JSON查询函数 ->andWhere('JSON_CONTAINS(u.roles, :roleParam) = 1') ->setParameter('roleParam', json_encode($role)) ->getQuery() ->getResult(); }
- 控制器中调用该方法查询管理员:
$Admins=$this->getDoctrine()->getRepository(User::class)->findUsersByRole('ROLE_ADMIN');
额外修正点
- 你实体中roles字段的类型标注错误,当前写的是
@var string,实际存储的是数组,需要改为@var array - 可以先在控制器中打印
$Admins的结果,确认查询是否返回数据,排除前端渲染的问题
内容的提问来源于stack exchange,提问作者user16742841
相关产品推荐
相关产品推荐

