微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Symfony 使用 findBy 传递数组

如何解决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 的屏幕截图,显示了角色在数据库中的存储方式

enter image description here

解决方法

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 举报,一经查实,本站将立刻删除。