按 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();
}
我的用户角色类型为 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();
}