我使用一些自定義的DQL函數來過濾PostgreSQL中的一些JSONB字段的行。這是我的查詢功能:原理拋出的'無效的模式名'錯誤,但原始的SQL似乎工作
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
- 教義/ DBAL V2.6.1
- 教義/ ORM DEV-主e3ecec3(== 2.6.x的-DEV)
- 的symfony/symfony的v3.3.4