按 JSON 值过滤 Doctrine

Filter by JSON values on Doctrine

我的用户角色类型为 json,我想按角色获取用户列表。

/**
 * @ORM\Column(type="json")
 */
private $roles = [];
$queryBuilder
    ->where("$rootAlias.roles LIKE :role")
    ->setParameter('role', '["ROLE_USER"]')
;

这是我得到的错误:

An exception occurred while executing a query: SQLSTATE[42883]: Undefined function: 7 ERROR: operator does not exist: json ~~ unknown\nLINE 1: ...ce s1_ ON u0_.service_id = s1_.id WHERE u0_.roles LIKE OR...\n
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.

像这样很好用"roles"::TEXT LIKE :role但我不知道如何在查询生成器中转换"roles"::TEXT

要使用 json,您可以使用 DoctrineJsonFunctions 扩展。

安装

composer require scienta/doctrine-json-functions

config/packages/doctrine.yaml

中声明一个函数
orm:
    dql:
        string_functions: 
            JSON_GET_TEXT: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Postgresql\JsonGetText

现在您可以在您的 UserRepository 中写入这样的请求

   public function getUsersByRole($role){
        return $this->createQueryBuilder('u')
           ->where("JSON_GET_TEXT(u.roles,0) = :role ")
           ->setParameter('role', $role)
           ->getQuery()
           ->getResult();
    }