Я не получаю ожидаемый результат запроса doctrine как запрос sql mysql, я использую пространственное расширение doctrine2

Я выбираю сайты, которые входят в многоугольник, используя следующий собственный запрос SQL.
И это дает мне количество идентификаторов сайта.

SELECT s.siteID from Sites s where st_contains( (SELECT polygon from Region where RegionId=9 ) , point( s.latitude,s.longitude ) )=1 ;

Но когда я делаю то же самое с доктриной, это дает мне пустой массив.

$queryBuilder = $this->createQueryBuilder('s');
$queryBuilder
->where('ST_Contains( :polygon, point(s.latitude, s.longitude) ) = 1')
->setParameter('polygon', $region->getPolygon());
print_r($queryBuilder->getQuery()->getResult());

$ region-> getPolygon () Дает мне следующий вывод

CrEOF\Spatial\PHP\Types\Geometry\Polygon Object
(
[rings:protected] => Array
(
[0] => Array
(
[0] => Array
(
[0] => 48.806863
[1] => 17.050781
)

[1] => Array
(
[0] => 47.813155
[1] => 17.116699
)

[2] => Array
(
[0] => 47.457809
[1] => 16.765137
)

[3] => Array
(
[0] => 46.920255
[1] => 16.237793
)

[4] => Array
(
[0] => 46.664517
[1] => 15.666504
)

[5] => Array
(
[0] => 46.589069
[1] => 14.47998
)

[6] => Array
(
[0] => 47.249407
[1] => 14.282227
)

[7] => Array
(
[0] => 47.635784
[1] => 14.677734
)

[8] => Array
(
[0] => 48.210032
[1] => 15.578613
)

[9] => Array
(
[0] => 48.618385
[1] => 15.864258
)

[10] => Array
(
[0] => 48.748945
[1] => 16.721191
)

[11] => Array
(
[0] => 48.806863
[1] => 17.050781
)

)

)

[srid:protected] =>
)

1

Решение

Потратив на это еще 1 день, я нашел проблему. setParameter() имеет третий параметр, мы можем упомянуть тип данных параметра.

->setParameter('polygon', $region->getPolygon());

Вот :polygon тип данных был строкой, а не полигоном.

Вы можете сделать это следующим образом.

$queryBuilder = $this->createQueryBuilder('s');
$queryBuilder
->where('ST_Contains( :polygon, point(s.latitude, s.longitude) ) = 1')
->setParameter('polygon', $region->getPolygon(), 'polygon');
print_r($queryBuilder->getQuery()->getResult());

Если вы не знаете, какой именно ключ для типа данных «полигон».
Тогда используйте print_r(Type::getTypesMap()); чтобы получить список всех добавленных типов данных.

В моем случае это было

Array
(
[array] => Doctrine\DBAL\Types\ArrayType
[simple_array] => Doctrine\DBAL\Types\SimpleArrayType
[json_array] => Doctrine\DBAL\Types\JsonArrayType
[object] => Doctrine\DBAL\Types\ObjectType
[boolean] => Doctrine\DBAL\Types\BooleanType
[integer] => Doctrine\DBAL\Types\IntegerType
[smallint] => Doctrine\DBAL\Types\SmallIntType
[bigint] => Doctrine\DBAL\Types\BigIntType
[string] => Doctrine\DBAL\Types\StringType
[text] => Doctrine\DBAL\Types\TextType
[datetime] => Doctrine\DBAL\Types\DateTimeType
[datetimetz] => Doctrine\DBAL\Types\DateTimeTzType
[date] => Doctrine\DBAL\Types\DateType
[time] => Doctrine\DBAL\Types\TimeType
[decimal] => Doctrine\DBAL\Types\DecimalType
[float] => Doctrine\DBAL\Types\FloatType
[binary] => Doctrine\DBAL\Types\BinaryType
[blob] => Doctrine\DBAL\Types\BlobType
[guid] => Doctrine\DBAL\Types\GuidType
[geometry] => CrEOF\Spatial\DBAL\Types\GeometryType
[point] => CrEOF\Spatial\DBAL\Types\Geometry\PointType
[polygon] => CrEOF\Spatial\DBAL\Types\Geometry\PolygonType
[linestring] => CrEOF\Spatial\DBAL\Types\Geometry\LineStringType
)
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]