Doctrine & Symfony - Получить данные из базы данных с параметром в столбце массива - PullRequest
1 голос
/ 14 февраля 2020

Добрый день,

Я пытаюсь найти из моей базы данных c пользователей с ролью, которая передается в параметре в запрос. Однако в настоящее время у меня есть «нулевой» результат.

Класс пользователей похож на этот пример из 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()
        ;
    } 
}

Я ожидаю возврата массива, который содержит одного или нескольких пользователей, имеющих роль.

Ответы [ 3 ]

0 голосов
/ 15 февраля 2020

Во-первых, в классе из приведенного вами примера нет объявленной переменной, называемой ролями, поэтому вы не можете написать это

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

Так что в вашем классе User у вас должно быть что-то подобное

private $roles;

Также, как сказано здесь , вы можете иметь «несколько таблиц и присоединиться к ним в ваших запросах».

Таким образом, у вас будет 1 таблица для всех ваших ролей, один для пользователей и один с именем user_roles, где вы будете хранить роли для каждого пользователя. Следующим шагом, к которому я бы подошел, является поиск в новой таблице нужного мне пользователя, а затем извлечение всех строк, содержащих разные роли в массиве.

Также существуют другие способы - заявлено здесь . Метод, который я рекомендую при хранении массивов, состоит в том, чтобы иметь поле VARCHAR (или TEXT), а затем использовать (в вашем случае) Symfony компонент сериализатора до serialize () массив при сохранение в БД и десериализация () при необходимости.

0 голосов
/ 19 февраля 2020

Добрый вечер,

Спасибо за вашу помощь.

Чтобы решить эту проблему, я решил, что у пользователя есть только одна роль в приложении, в этом контексте решение выглядит следующим образом:

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()
    ;
}
0 голосов
/ 14 февраля 2020

c.roles - это список, который может содержать несколько элементов (ролей), поэтому, пожалуйста, поменяйте местами вот так:

WHERE :role IN c.roles

PS: убедитесь, что регистр string $role выше (например, "ROLE_ADMIN").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...