我正在尝试执行这个查询:
public function getLakesNearby($minLat, $maxLat, $minLng, $maxLng, $lat, $lng, $limit)
{
$query = $this->_em->createQuery(' SELECT a
FROM MycBundle:Lake a
WHERE a.latitude > :minLat AND a.latitude < :maxLat AND a.longitude > :minLng AND a.longitude < :maxLng
ORDER BY ABS(a.latitude - :lat) + ABS(a.longitude - :lng) ASC
LIMIT :limit ');
$query->setParameters(array('minLat' => $minLat, 'maxLat' => $maxLat, 'minLng' => $minLng, 'maxLng' => $maxLng, 'Lat' => $lat, 'Lng' => $lng, 'limit' => $limit));
return $query->getResult();
}
产生一个错误
[语法错误]line 0, col 234: Error: Expected end of string, got '('
我看到Doctrine不支持ABS()。
请帮我找到一个解决方案。
谢谢
这应该是您在QueryBuilder格式中寻找的内容。这是我的头,不是在一个地方,我可以测试它,所以你可能想用它作为一个开始。
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('a');
$qb->from('MycBundle:Lake', 'a');
$qb->where('a.latitude > :minLat');
$qb->andWhere('a.latitude < :maxLat');
$qb->andWhere('a.longitude > :minLng');
$qb->andWhere('a.longitude < :maxLng');
$qb->add('orderBy', $qb->expr()->sum($qb->expr()->abs('a.latitude - :lat'), $qb->expr()->abs('a.longitude - :lng'));
$qb->setParameters(array(
'minLat' => $minLat,
'maxLat' => $maxLat,
'minLng' => $minLng,
'maxLng' => $maxLng,
'lat' => $lat,
'lng' => $lng)
);
$qb->setMaxResults($limit);
return $qb->getQuery()->getResult();