Doctrine 信条距离函数

Doctrine 信条距离函数,doctrine,geometry,distance,dql,Doctrine,Geometry,Distance,Dql,我尝试使用一个函数来计算$user lat/lng和BDD中有限距离的坐标之间的距离 这是一个SQL请求,我尝试使用条令来实现它 这是我的密码 $config = new \Doctrine\ORM\Configuration(); $config->addCustomNumericFunction('COS', 'DoctrineExtensions\Query\Mysql\Cos'); $config->addCustomNumericFunction

我尝试使用一个函数来计算$user lat/lng和BDD中有限距离的坐标之间的距离

这是一个SQL请求,我尝试使用条令来实现它

这是我的密码

    $config = new \Doctrine\ORM\Configuration();

    $config->addCustomNumericFunction('COS', 'DoctrineExtensions\Query\Mysql\Cos');

    $config->addCustomNumericFunction('ACOS', 'DoctrineExtensions\Query\Mysql\Acos');

    $config->addCustomNumericFunction('RADIANS', 'DoctrineExtensions\Query\Mysql\Radians');

    $config->addCustomNumericFunction('SIN', 'DoctrineExtensions\Query\Mysql\Sin');

    $maxLat = $form_citylat + rad2deg($rad / $R);
    $minLat = $form_citylat - rad2deg($rad / $R);
    $maxLng = $form_citylng + rad2deg(asin($rad / $R) / cos(deg2rad($form_citylat)));
    $minLng = $form_citylng - rad2deg(asin($rad / $R) / cos(deg2rad($form_citylat)));


    $qb = $this->createQueryBuilder('u')->select('u.lat, u.lng')
        ->addSelect('acos(sin(:lat)*sin(radians(u.Lat)) + cos(:lat)*cos(radians(u.Lat))*cos(radians(u.lng)-:lng)) * :R As D')
        ->where('lat Between :minlat And :maxlat And lng Between :minlng And :maxlng And acos(sin(:lat)*sin(radians(u.Lat)) + cos(:lat)*cos(radians(u.Lat))*cos(radians(u.Lng)-:lng)) * :R < :rad')
        ->setParameter('lat',deg2rad($form_citylat))
        ->setParameter('lng',deg2rad($form_citylng))
        ->setParameter('minlat',$minLat)
        ->setParameter('minlng',$minLng)
        ->setParameter('maxlat',$maxLat)
        ->setParameter('maxlng',$maxLng)
        ->setParameter('rad',$rad)
        ->setParameter('R',$R)
        ->orderBy('D');

    return $qb->getQuery()->getResult();`
$config=new\Doctrine\ORM\Configuration();
$config->addCustomNumericFunction('COS','DoctrineExtensions\Query\Mysql\COS');
$config->addCustomNumericFunction('ACOS','DoctrineExtensions\Query\Mysql\ACOS');
$config->addCustomNumericFunction('RADIANS','DoctrineExtensions\Query\Mysql\RADIANS');
$config->addCustomNumericFunction('SIN','DoctrineExtensions\Query\Mysql\SIN');
$maxLat=$form_cityla+rad2deg($rad/$R);
$minLat=$form_cityla-rad2deg($rad/$R);
$maxLng=$form_citylng+rad2deg(asin($rad/$R)/cos(deg2rad($form_cityla));
$minLng=$form_citylng-rad2deg(asin($rad/$R)/cos(deg2rad($form_cityla));
$qb=$this->createQueryBuilder('u')->选择('u.lat,u.lng'))
->addSelect('acos(sin(:lat)*sin(radians(u.lat))+cos(:lat)*cos(radians(u.lat))*cos(radians(u.lng)-:lng))*:R As D')
->其中('lat介于:minlat和:maxlat之间,lng介于:minlng和:maxlng和acos之间(sin(:lat)*sin(弧度(u.lat))+cos(:lat)*cos(弧度(u.lat))*cos(弧度(u.lng)-:lng))*:R<:rad')
->setParameter('lat',deg2rad($form_cityla))
->setParameter('lng',deg2rad($form_citylng))
->setParameter('minlat',$minlat)
->setParameter('minlng',$minlng)
->setParameter('maxlat',$maxlat)
->setParameter('maxlng',$maxlng)
->setParameter('rad',$rad)
->setParameter('R',$R)
->订货人(“D”);
返回$qb->getQuery()->getResult()`
但我得到了这个错误信息:

[语法错误]第0行第40列:错误:应为 条令\ORM\Query\Lexer::T_CLOSE_括号,得到“.”

我尝试了不同的选择,但不起作用

有人有答案吗?

公共函数通过theme和distance($theme,$distance,$user)查找{
$latUser=$user->getAddress()->getLnt();
$lngUser=$user->getAddress()->getLgt();
返回$this->createQueryBuilder('a')
//->选择('a as activity,dist('.$distance.')as distance')
->join('a.author','u')
->加入('u.address','add')
->andWhere('a.theme=:val')
->其中('(6378*acos(cos(radians(add.lnt))*cos(radians('$latUser'))*cos(radians('$lngUser'))-radians(add.lgt))+sin(radians(add.lnt))*sin(radians('$latUser'))<:distance')
->setParameter('distance',$distance)
->setParameter('val',$theme)
->orderBy('a.author','ASC')
->getQuery()
->getResult();
}

我真的在尝试做同样的事情。你找到解决这个问题的方法了吗?请给出你的答案,并解释你的代码是如何解决这个问题的。