2011-12-16 60 views
1

我寫了一個自定義的DQL函數。在這個功能我用的是相同的參數兩次:不能在自定義函數中使用兩次相同的參數

public function getSql(SqlWalker $sqlWalker) 
{ 
    $point1_lat = $this->point1_lat->dispatch($sqlWalker); 
    $point1_lon = $this->point1_lon->dispatch($sqlWalker); 
    $point2_lat = $this->point2_lat->dispatch($sqlWalker); 
    $point2_lon = $this->point2_lon->dispatch($sqlWalker); 

    $unitFactor = 6366.56486; // earth radius in km 

    return " 
     $unitFactor * 
     2 * 
     ASIN(
      SQRT(
       POWER(
        SIN(($point1_lat - $point2_lat) * pi()/180/2), 
        2 
       ) + 
       COS($point1_lat * pi()/180) * 
       COS($point2_lat * pi()/180) * 
       POWER(
        SIN(($point1_lon - $point2_lon) * pi()/180/2), 
        2 
       ) 
      ) 
     ) 
    "; 
} 

這是如何執行查詢:

$q = \App::get()->getEntityManager()->createQuery(' 
     SELECT 
      s, 
      GEO_DISTANCE(
       :lat, 
       :lng, 
       s.glat, 
       s.glng 
      ) AS distance 
     FROM 
      \Application\Geo\Entity\Street s 
    '); 
    $q->setMaxResults(10); 
    $q->setParameters(array(
     'lat' => 52.25948, 
     'lng' => 6.76403, 
    )); 
    $result = $q->getResult(); 

然而,這使我有以下異常:

消息:SQLSTATE [ HY093]:無效的參數號碼:綁定的號碼 變量與令牌的數量不匹配

下面的SQL被getSql()返回:

 6366.56486 * 
     2 * 
     ASIN(
      SQRT(
       POWER(
        SIN((? - g0_.glat) * pi()/180/2), 
        2 
       ) + 
       COS(? * pi()/180) * 
       COS(g0_.glat * pi()/180) * 
       POWER(
        SIN((? - g0_.glng) * pi()/180/2), 
        2 
       ) 
      ) 
     ) 

所以我想拋出異常,因爲命名的參數作爲索引參數返回。這是教條中的錯誤還是我做錯了什麼?

回答

0

這是不是一個錯誤,你只能使用每個參數一次,因爲dispatch()函數會將值棧上一次,在查詢匹配一個?佔位符。

作爲一種變通方法,你可以調用調度()幾次:

public function getSql(SqlWalker $sqlWalker) 
{ 
    $point1_lat_a = $this->point1_lat->dispatch($sqlWalker); 
    $point1_lat_b = $this->point1_lat->dispatch($sqlWalker); 
    $point1_lon = $this->point1_lon->dispatch($sqlWalker); 

    $point2_lat_a = $this->point2_lat->dispatch($sqlWalker); 
    $point2_lat_b = $this->point2_lat->dispatch($sqlWalker); 
    $point2_lon = $this->point2_lon->dispatch($sqlWalker); 

    $unitFactor = 6366.56486; // earth radius in km 

    return " 
     $unitFactor * 
     2 * 
     ASIN(
      SQRT(
       POWER(
        SIN(($point1_lat_a - $point2_lat_a) * pi()/180/2), 
        2 
       ) + 
       COS($point1_lat_b * pi()/180) * 
       COS($point2_lat_b * pi()/180) * 
       POWER(
        SIN(($point1_lon - $point2_lon) * pi()/180/2), 
        2 
       ) 
      ) 
     ) 
    "; 
} 
相關問題