Doctrine & Symfony - 使用数组列上的参数从数据库获取数据

Doctrine & Symfony - Get data from database with parameter on array column

下午好,

我尝试从我的数据库中查找具有传递给查询参数的角色的特定用户。但是,我目前有 "null" 个结果。

用户 class 是这样的 example 来自 Symfony 文档。

这是我的 CustomerRepository:

class CustomerRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Customer::class);
    }

    public function findByRole(string $role)
    {
        return $this->getEntityManager()->createQuery(
            'SELECT c
             FROM App\Entity\Customer c
              WHERE c.roles IN (:role)'
        )
            ->setParameter(':role', $role)
            ->getResult()
        ;
    } 
}

我希望 return 包含一个或多个具有该角色的用户的数组。

c.roles 是一个可以包含多个项目(角色)的列表,所以请你像这样反转 where :

WHERE :role IN c.roles

PS:确保 string $role 的大小写为大写(例如 "ROLE_ADMIN")。

首先,在您给出的示例中的 class 中,没有声明名为 roles 的变量,因此您不能这样写

 ... WHERE c.roles IN (:role)'

所以在你的用户 class 你应该有这样的东西

private $roles;

Also as it said here you can have "multiple tables and JOIN them in your queries."

因此您将有 1 个 table 用于所有角色,一个用于用户,另一个称为 user_roles,您将在其中存储每个用户的角色。 我打算采取的下一步是在这个新 table 中搜索我想要的用户,然后检索数组中包含不同角色的所有行。

还有其他方式 - 在需要时说明here. The method I recommend when storing arrays is to have a VARCHAR field (or TEXT) and then use (in your case) the Symfony serializer component to serialize() the array when saving in the DB and to deserialize()

晚上好,

谢谢你的帮助。

为了解决这个问题,我考虑到一个User在应用中只有一个角色,在这种情况下,解决方案是这样的:

public function findByRole(string $role, int $isActive = 1): ?Customer
{
    return $this->getEntityManager()->createQuery(
            'SELECT c
             FROM App\Entity\Cutomer c
             WHERE c.roles LIKE :role
             AND c.isActive = :isActive'
        )
        ->setParameters([
             ':role' => '%'.$role.'%',
             ':isActive' => $isActive,
        ])
        ->getOneOrNullResult()
    ;
}