如何解决Symfony 使用 findBy 传递数组
我在我的项目中使用 Symfony 4,我试图通过作为查询参数传递的角色获取用户列表,但我在尝试传递数组时遇到了 findBy 函数进去
用户实体有一个叫做角色的属性(来自 User.PHP 的代码)
/**
* @ORM\Column(type="json")
*/
private $roles = [];
/**
* @see UserInterface
*/
public function getRoles(): array
{
$roles = $this->roles;
// guarantee every user at least has ROLE_USER
$roles[] = 'ROLE_USER';
return array_unique($roles);
}
public function setRoles(array $roles): self
{
$this->roles = $roles;
return $this;
}
控制器:
public function get_all_users(
Request $request
) {
if ($request->query->get('role')) {
$selectedRole = $request->query->get('role');
$users = $this->getDoctrine()
->getRepository(User::class)
->findBy(['roles' => $selectedRole])
//->findBy(['roles' => ['ROLE_CANDIDATE','ROLE_USER']])
//->findBy(['roles' => ['ROLE_CANDIDATE']])
//->findBy(['roles' => 'ROLE_CANDIDATE'])
;
//->findBy(['roles' => ['ROLE_CANDIDATE','ROLE_USER']])
} else {
//fetch all users
$users = $this->getDoctrine()
->getRepository(User::class)
->findAll()
;
}
//Response
return $this->json([
'message' => 'Users fetched successfully','users' => $users,],200,[],['groups' => 'UserResponse']);
}
这是表 user
的屏幕截图,显示了角色在数据库中的存储方式
解决方法
findBy 方法使用精确的对应关系。另外你的角色是在数据库中编码的json。因此,您无法通过这样的角色检索您的用户。
您必须使用 DQL 和“喜欢”条件:
如果您希望按多个角色进行过滤,这里有一些快速示例,您可以在用户目录中使用。 (将检索具有这些角色列表中的每个用户)
/**
* @return User[]
*/
public function findUserByRole(array $roles): array
{
$qb = $this->createQueryBuilder('user');
$or = false;
foreach ($roles as $key => $role) {
if ($or) {
$qb->orWhere('user.roles like :role' . $key)
->setParameter('role' . $key,'%' . $role . '%');
} else {
$qb->where('user.roles like :role' . $key)
->setParameter('role' . $key,'%' . $role . '%');
$or = true;
}
}
return $qb->getQuery()
->getResult();
}
更改 or by and 以匹配具有完全所有这些角色的每个用户
,不确定,但我认为 findBy 完全匹配。 $roles 字段是 Doctrine 的 simple_array(或 json_array,现在不记得了)所以你永远不会通过角色名称找到
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。