首页 > 解决方案 > 如何在查询生成器中使用 NOT LIKE?

问题描述

我正在使用 symfony 4.4 和 postgres 11.7。

我有一个带有 json 字段“角色”的用户类(例如 [“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();

但我需要一个对象的数组,而不是二维数组。

一些帮助?

标签: postgresqlsymfony

解决方案


在文档中,我发现了这种写作方式:

// 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

也许它会帮助你


推荐阅读