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 以匹配具有所有这些角色的每个用户