Я использую 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();
Но мне нужен массив объекта, а не двумерный массив.
Некоторая помощь?