Doctrine orm 按角色获取用户

Doctrine orm 按角色获取用户,doctrine-orm,doctrine,Doctrine Orm,Doctrine,我在一个实体(用户)中有一个实体(组)数组,在我的查询生成器中,我希望按角色检索用户 我正在尝试这样做: public function findUsersByRole($role){ $qb = $this->createQueryBuilder('u'); $qb->select('u') ->where('u.roles LIKE :role') ->setParameter('role', $role); re

我在一个实体(用户)中有一个实体(组)数组,在我的查询生成器中,我希望按角色检索用户

我正在尝试这样做:

public function findUsersByRole($role){
    $qb = $this->createQueryBuilder('u');
    $qb->select('u')
       ->where('u.roles LIKE :role')
       ->setParameter('role', $role);

    return $qb->getQuery()->getResult();
}
但我没有得到结果

我也试过:

public function findUsersByRole($role)
{
  $qb = $this->createQueryBuilder('u');
  $qb->select('u')
      ->where(':role MEMBER OF u.roles')
      ->setParameter('role', $role);
  return $qb->getQuery()->getResult();
}
但我得到了一个错误:

[语义错误]第0行,第62列“角色”附近:错误:无效 路径表达式。必须是CollectionValuedAssociationField

我做错了什么

角色存储在JSON类型的用户表字段roles字段中,如下所示:

[
    "ROLE_USER",
    "ROLE_ADMIN"
]
这是在数据库中存储用户角色的用户类的函数:

public function setRoles(array $roles){
    $this->roles = $roles;
}
这是我编写的单元测试,用于测试TestFindUserByRole函数:

public function testFindUsersByRole() {
    $user1 = $this->createUser(1, "Developer", "John", "Smith", "smith@test.com");
    $user2 = $this->createUser(2, "Developer", "Joe", "Black", "joe@test.com");
    $user3 = $this->createUser(3, "Developer", "Jack", "Blade", "blade@test.com");

    $roles1 = ['ROLE_ADMIN','ROLE_USER'];
    $roles2 = ['ROLE_USER'];

    $user1->setRoles($roles1);
    $user2->setRoles($roles2);

    $response = $this->userRepository->findUsersByRole('ROLE_ADMIN');
    $this->assertCount(1, $response);

    $this->purge([$user1, $user2, $user3]);
}

我发现我做错了什么。
在我的单元测试中,在分配角色后,我没有将用户实体保存到数据库中。 所以我修正了这样的单元测试

public function testFindUsersByRole() {
    $user1 = $this->createUser(1, "Developer", "John", "Smith", "smith@test.com");
    $user2 = $this->createUser(2, "Developer", "Joe", "Black", "joe@test.com");
    $user3 = $this->createUser(3, "Developer", "Jack", "Blade", "blade@test.com");

    $roles1 = ['ROLE_ADMIN','ROLE_USER'];
    $roles2 = ['ROLE_USER'];

    $user1->setRoles($roles1);
    $user2->setRoles($roles2);

    $this->entityManager->persist($user1);
    $this->entityManager->persist($user2);
    $this->entityManager->flush();

    $response = $this->userRepository->findUsersByRole('ROLE_ADMIN');
    $this->assertCount(1, $response);

    $this->purge([$user1, $user2, $user3]);
}
那么,该功能就是起作用的功能:

public function findUsersByRole($role){
    $qb = $this->createQueryBuilder('u');
    $qb->select('u')
       ->where('u.roles LIKE :roles')
       ->setParameter('roles', '%"'.$role.'"%');
    
    return $qb->getQuery()->getResult();
  }

你试过调试这个问题吗?
角色
列使用哪种数据类型?如果你想像搜索一样运行
,有什么理由跳过通配符吗?角色不是用json编码的吗?应该有方法在DQLI中搜索它们。我在问题中添加了一些关于用户存储方式的详细信息。它们存储为数组,而不是JSON。你说得对,我已经检查了列的数据类型,它是JSON。这是否回答了你的问题?