2013-08-20 4 views
0

Я хотел бы постраничный круговой запрос на MySQL, а именно это:CakePHP - Специальный запрос в PAGINATION

SELECT *, 
    (
     6371 * acos(
       cos(radians($lat)) * cos(radians(lat)) 
      * cos(radians(lng) 
      - radians($lng) 
    ) 
    + sin(radians($lat) 
    ) * sin(radians(lat)))) AS distance 
    FROM {$this->table} HAVING distance < $dist 
    ORDER BY distance LIMIT $offset , $limit; 

К сожалению, я вижу Pagination component работает только через какой-то построитель запросов.

Есть ли способ, которым я могу использовать этот запрос в любом случае?

+0

Вы должны проверить раздел о виртуальных полях: http://book.cakephp.org/2.0/ ru/models/virtual-fields.html - также вас может заинтересовать [geocoding-with-cakephp] (http://www.dereuromark.de/2012/06/12/geocoding-with-cakephp/). – mark

+0

@mark Я не могу использовать виртуальные фиксы здесь, потому что в поле есть 2 параметра: '$ lat' и' $ lng'. Но геологический плагин я рассмотрю позже. – Lanbo

+0

Aint a excuse :) Там в связанном примере он также принимает два параметра - посмотрите на код. – mark

ответ

0

Таким образом, получается, вы можете добавить виртуальные поля после объявления класса, например, так:

public function addDistanceVirtualField($lng, $lat) { 
    $this->virtualFields['distance'] = <<<EOT 
    (
     6371 * acos(
       cos(radians($lat)) * cos(radians({$Model->alias}.lat)) 
      * cos(radians({$Model->alias}.lng) 
      - radians($lng) 
    ) 
    + sin(radians($lat) 
    ) * sin(radians({$Model->alias}.lat)))) 
EOT; 
} 
+0

Я по-прежнему использую поведение для более чистого подхода. Но, да, это, в основном, путь. – mark