Как использовать НЕ НРАВИТСЯ в построитель запросов? - PullRequest
0 голосов
/ 28 февраля 2020

Я использую symfony 4.4 и postgres 11.7.

У меня есть класс User с json полем "role" (например, ["ROLE_USER"], ["ROLE_USER", "ROLE_ADMIN"]), и я пытаюсь получить пользователей, которым поле ролей не соответствует "ROLE_ADMIN", используя QueryBuilder.

Я пытался

$qb = $this->createQueryBuilder('u');
    return $qb
            ->where($qb->expr()->notLike('u.roles', ":roles"))
            ->setParameter('roles', $qb->expr()->literal('%ROLE_ADMIN%'))
            ->getQuery()
            ->getResult();

, но ошибка

SQLSTATE[42883]: Undefined function: 7 ERROR: operator does not exist: json !~~ unknown
    LINE 1: ...e_id AS sede_id_7 FROM utente u0_ WHERE u0_.roles NOT LIKE $...
    ^
    HINT: No operator matches the given name and argument types. You might need to add explicit type casts.

, поэтому следующим шагом было использование функции CAST (postgres)

$query = $entityManager->createQuery("
    SELECT u
    FROM App\Entity\User u
    WHERE CAST(u.roles AS TEXT) NOT like '%ROLE_ADMIN%'
");

и ошибка

[Syntax Error] line 0, col 64: Error: Expected known function, got 'CAST'

единственной успешной попыткой было написать запрос в стандарте SQL

$conn = $this->getEntityManager()->getConnection();
$sql = "
       SELECT * 
       FROM utente u
       WHERE CAST(u.roles AS TEXT) NOT like '%ROLE_ADMIN%'
";
$stmt = $conn->prepare($sql);
$stmt->execute([]);
return $stmt->fetchAll();

Но мне нужен массив объекта, а не двумерный массив.

Некоторая помощь?

1 Ответ

0 голосов
/ 03 марта 2020

В документации я нашел такой способ написания:

// Example - $qb->expr()->neq('u.id', '?1') => u.id <> ?1
    public function neq($x, $y); // Returns Expr\Comparison instance

Источник: https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/query-builder.html#the -expr-class

Возможно, это поможет вам

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