【发布时间】:2018-01-09 16:46:35
【问题描述】:
我正在使用一些自定义 DQL 函数来按 PostgreSQL 中的一些 JSONB 字段过滤行。这是我的查询函数:
private function findTopLevelResources(): array {
return $this->createQueryBuilder('r')
->where("JSON_EXISTS(r.contents, '-1') = FALSE")
->getQuery()
->getResult();
}
运行此代码会导致DriverException 来自AbstractPostgreSQLDriver:
An exception occurred while executing 'SELECT r0_.id AS id_0, r0_.marking AS marking_1, r0_.contents AS contents_2, r0_.kind_id AS kind_id_3 FROM resource r0_ WHERE r0_.contents?'-1' = false':
SQLSTATE[3F000]: Invalid schema name: 7 ERROR: schema "r0_" does not exist
LINE 1: ... r0_.kind_id AS kind_id_3 FROM resource r0_ WHERE r0_.conten...
^
我尝试从 PHPStorm 手动执行原始 SQL 查询,它工作正常,没有错误。
如何让它在 Doctrine 中工作?
为什么这个查询不适用于 Doctrine,但是当我手动测试它时呢?
这里是JSON_EXISTS:(基于syslogic/doctrine-json-functions)
class JsonExists extends FunctionNode
{
const FUNCTION_NAME = 'JSON_EXISTS';
const OPERATOR = '?';
public $jsonData;
public $jsonPath;
public function getSql(SqlWalker $sqlWalker)
{
$jsonData = $sqlWalker->walkStringPrimary($this->jsonData);
$jsonPath = $this->jsonPath->value;
return $jsonData . self::OPERATOR . "'$jsonPath'";
}
public function parse(Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->jsonData = $parser->StringPrimary();
$parser->match(Lexer::T_COMMA);
$this->jsonPath = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
通过 Symfony 的 YAML 配置注册,如下所示:
doctrine:
orm:
dql:
numeric_functions:
json_exists: Syslogic\DoctrineJsonFunctions\Query\AST\Functions\Postgresql\JsonExists
东西的版本:
- PHP 7.1.1
- doctrine/dbal v2.6.1
- doctrine/orm dev-master e3ecec3 (== 2.6.x-dev)
- symfony/symfony v3.3.4
【问题讨论】:
标签: doctrine-orm dql postgresql-9.5 doctrine-query