2016-10-25 19 views
0

地域のポイントと私のポイントとの間の最小距離を見つけたいと思います。私はそれについて検索しST_CONTAINを見つけ、私はこの機能を使用する場合しかし、私はエラーを取得する:ここでLaravel + Doctrine - ST_DISTANCEで最も近い場所を取得

Expected known function, got 'ST_Distance' 

は私のコードです:

public function getNearestPlace(Point $point) 
{ 
    $neighborhoods = $this->_em 
     ->createQueryBuilder() 
     ->select('Region') 
     ->from($this->entityClass, 'Region') 
     ->where(
      ' 
       MIN (ST_Distance(
        Region.regionMapCenter, 
        GeomFromText(\'POINT(' . $point . ')\') 
       ) > 0 
      ' 
     ) 
     ->getQuery() 
     ->execute(); 
    return $neighborhoods; 
} 

それを解決する方法は?

答えて

0

Doctrineにはsome functions out-of-the-boxが付属していますが、距離関数はそれらの間にありません。独自の関数を定義することもできますが、これはあなたの場合に役立つかもしれません。これについてのドキュメントは、in chapter 14.5.5. Adding your own functions to the DQL language

また、a nice blog postあなたのアプリケーションに距離機能を追加する方法についても見つかりました。多分このblogpostも役立つでしょう。ブログ投稿の距離関数は次のようになります。

<?php 
namespace Wantlet\ORM; 

use Doctrine\ORM\Query\AST\Functions\FunctionNode; 
use Doctrine\ORM\Query\Lexer; 

/** 
* DQL function for calculating distances between two points 
* 
* Example: DISTANCE(foo.point, POINT_STR(:param)) 
*/ 
class Distance extends FunctionNode { 
    private $firstArg; 
    private $secondArg; 

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) { 
     //Need to do this hacky linestring length thing because 
     //despite what MySQL manual claims, DISTANCE isn't actually implemented... 
     return 'GLength(LineString(' . 
       $this->firstArg->dispatch($sqlWalker) . 
       ', ' . 
       $this->secondArg->dispatch($sqlWalker) . 
      '))'; 
    } 

    public function parse(\Doctrine\ORM\Query\Parser $parser) { 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 
     $this->firstArg = $parser->ArithmeticPrimary(); 
     $parser->match(Lexer::T_COMMA); 
     $this->secondArg = $parser->ArithmeticPrimary(); 
     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 
} 
関連する問題