如何将 postgis 距离运算符 (<->) 与原则一起使用?



我想找到离给定点最近的纸牌并计算距离。链接postgis

但是我不能在symfony中执行查询:

$results = $this->createQueryBuilder('p')
->orderBy('(geog <->) ST_Point(:lon, :lat)', 'DESC')
->setParameter('lng', $lng)
->setParameter('lat', $lat)
->setMaxResults(9)
->getQuery()
->getResult();

我的错误:

[Syntax Error] line 0, col 64: Error: Expected DoctrineORMQueryLexer::T_CLOSE_PARENTHESIS, got '<'

→我知道不支持DQL,但我不明白如何在symfony 6.2上获得<->工作。

所以我也测试了这个解决方案:

$conn = $emi->getConnection();
$sql = '
SELECT * FROM fiche f
ORDER BY geog <-> ST_Point(7, 49) limit 9
';
$stmt = $conn->prepare($sql);
$resultSet = $stmt->executeQuery();
dd($resultSet->fetchAllAssociative());

我有一个数组的结果,但我没有'Form'实体的对象的映射(我发现这个解决方案太残酷)

我也使用了doctrine-postgis包。我还希望在第二步中添加距离(在lgn和lat变量之间),并在我的实体(我没有映射到ORM)的"距离"字段中添加9的结果

public ?float $distance = null;

我的类:

class Poi
{
#[ORMColumn(nullable: true)]
private ?float $latitude = null;
#[ORMColumn(nullable: true)]
private ?float $longitude = null;
#[ORMColumn(type: PostGISType::GEOGRAPHY, nullable: true)]
private string $geog;

public ?float $distance = null;

Doctrine允许您使用新功能扩展DQL。这正是postgis扩展所做的,您可以通过查看例如https://github.com/jsor/doctrine-postgis/tree/main/src/Functions.

中的文件来了解它是如何做到的。您也可以自己扩展DQL。要做到这一点,因为你在Symfony中使用Doctrine,你应该遵循Symfony关于注册自定义Doctrine函数的文档:https://symfony.com/doc/current/doctrine/custom_dql_functions.html。它引用Doctrine自己关于创建自定义DQL函数的文档,但是一旦PHP类被声明,注册它们的方式就不同了。

然后将<->作为函数实现,这样DQL中的MyNewFunction(A, B)就可以在postgres中编译成A <-> B。这样做是因为(据我所知)在Doctrine中不能定义自定义操作符,只能定义自定义函数。你可以看看这个stackoverflow问题,看看其他用户是如何处理类似问题的:https://github.com/semin-lev/ltree-extension-bundle/blob/master/DqlFunction/LtreeOperatorFunction.php.

最新更新