Symfony 使用 findBy 传递数组
Symfony passing array using 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']);
}
当我尝试按角色获取用户时,响应总是空的
这是 table user
的屏幕截图,用于显示角色在数据库中的存储方式
不确定,但我认为 findBy 进行了精确匹配。 $roles 字段是 Doctrine 的 simple_array(或 json_array,现在不记得了)所以你永远不会通过角色名称
找到
findBy 方法使用精确对应。另外,您的角色在数据库中进行了 json 编码。所以你不能像这样按角色检索你的用户。
您将必须使用 DQL 和 'like' 条件:
如果您希望按多个角色进行过滤,可以在您的用户目录中使用以下一些快速示例。 (将检索具有这些角色列表中的每个用户)
/**
* @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 以匹配具有所有这些角色的每个用户
我在我的项目中使用 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']);
}
当我尝试按角色获取用户时,响应总是空的
这是 table user
的屏幕截图,用于显示角色在数据库中的存储方式
不确定,但我认为 findBy 进行了精确匹配。 $roles 字段是 Doctrine 的 simple_array(或 json_array,现在不记得了)所以你永远不会通过角色名称
找到findBy 方法使用精确对应。另外,您的角色在数据库中进行了 json 编码。所以你不能像这样按角色检索你的用户。
您将必须使用 DQL 和 'like' 条件:
如果您希望按多个角色进行过滤,可以在您的用户目录中使用以下一些快速示例。 (将检索具有这些角色列表中的每个用户)
/**
* @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 以匹配具有所有这些角色的每个用户