我想找到离给定点最近的纸牌并计算距离。链接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.