ожидается синтаксическая ошибка doctrine querybuilder =, <, <=, <>,>,> =,! =, есть конец строки - PullRequest
0 голосов
/ 24 ноября 2018

Имеет следующую ошибку:

"[Синтаксическая ошибка] строка 0, столбец -1: ошибка: ожидается =, <, <=, <>,>,> =,! =, Получилконец строки. "

построение этого запроса с помощью построителя запросов доктрины:

SELECT * 
FROM area 
WHERE ST_Contains(polygon, ST_GeomFromText('POINT(13.405584 52.510621)', 1));

(Sf4 и Doctrine 2.6)

Конфигурация Orm:

orm:
    dql:
      numeric_functions:
        ST_Contains: CrEOF\Spatial\ORM\Query\AST\Functions\MySql\STContains
        ST_GeomFromText: App\Infrastructure\Persistence\Doctrine\STGeomFromText
        POINT: CrEOF\Spatial\ORM\Query\AST\Functions\MySql\Point

STGeoFromText Класс:

use CrEOF\Spatial\ORM\Query\AST\Functions\AbstractSpatialDQLFunction;

class STGeomFromText extends AbstractSpatialDQLFunction
{
    protected $platforms = array('mysql');

    protected $functionName = 'ST_GeomFromText';

    protected $minGeomExpr = 1;

    protected $maxGeomExpr = 2;
}

Построение запроса:

use CrEOF\Spatial\PHP\Types\Geometry\Point;

    $lon = 13.405584;
    $lat = 52.510621;
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->select('a.name')
        ->from(Area::class, 'a')
        ->where("ST_Contains(a.polygon, ST_GeomFromText(':point', 1))")
        ->setParameter('point', new Point($lon, $lat), 'point');
    $result = $query->getResult();

та же ошибка с:

->where("ST_Contains(a.polygon, ST_GeomFromText(:point, 1))")

замечать отсутствие присутствия переноса символапараметр: point.

1 Ответ

0 голосов
/ 28 ноября 2018

Ошибка происходит от Doctrine / ORM / Query / Parser.php , который пытается проанализировать и проверить сборку запроса.

Проблема вызвана тем, что этот синтаксический анализатор не «понимает» ST_Contains возвращает логическое значение и ожидает оператор сравнения, такой как " =, <, <=, <>,>,> =,! = ".

Чтобы преодолеть это, добавьте = true к вашему состоянию:

->where("ST_Contains(a.polygon, ST_GeomFromText(:point, 1)) = true")
...