2013-02-12 4 views
1

CakePHP 2.2.4에서 haversine 수식을 사용하여 거리를 계산할 때 결과 목록을 페이지 매김하려고하지만, having 절에 계산 된 필드.CakePHP 2.2.4 HAVING 절과 계산 된 필드를 사용하여 결과를 페이지 매김 할 수 없음 - Haversine 수식

나는 이것을 알아 내려고 노력하는 데 많은 시간을 투자했으나 할 수 없습니다. 몇 가지 게시물을 읽었습니다. 몇 가지 방법을 오버라이드해야한다고 말하면서, 다른 것들을 시도해 보았지만 이전 버전의 Cake와는 관련이 있다고 말했습니다.

제발 누군가 정확히 말해 내가이 일을하기 위해해야 ​​할 일이 있습니까? 똑같은 일을 성취하려고 노력한 수백 명의 사람들이 있어야합니다!

'Business' => array(
     'conditions' => array(
      'Business.is_active' => 1 
     ), 
     'fields' => array(
      'Business.*', 
      '(6371 * acos(cos(radians(' . $location['Location']['latitude'] . ')) * cos(radians(Business.latitude)) * cos(radians(Business.longitude) - radians(' . $location['Location']['longitude'] . ')) + sin(radians(' . $location['Location']['latitude'] . ')) * sin(radians(Business.latitude)))) AS distance' 
     ), 
     'group' => array(
      'Business.id HAVING distance <= 5', 
     ), 
     'contain' => array(
      'UserReview', 
      'Certification', 
      'Package' => array(
       'MassageType', 
       'PackageVariation' => array(
        'order' => array(
         'cost_in_dollars' => 'ASC' 
        ) 
       ) 
      ) 
     ), 
     'order' => array(
      'distance' => 'ASC', 
      'Business.name' => 'ASC', 
     ) 
    ) 

내가 점점 계속 오류는 다음과 같습니다 : 내가 사용

코드는

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'distance' in 'having clause'

도와주세요!

+1

여기서 가상 필드를 사용하지 않는 이유는 무엇입니까? – mark

+0

저장 프로 시저 및 저장 함수를 사용하여이 작업을 수행하는 것이 가장 좋을 것입니다 –

답변

0

나는 또한 절 문제가있는 해결책을 찾으려고 시도한 후에 포기했습니다. 그것 CakePHP V2에서 불가능한 것 같습니다. 마지막으로 나는 다른 방법으로 가야 :

$expression = '(3959 * acos(cos(radians(' . $session_lat . ')) * cos(radians(User.lat)) * cos(radians(User.lng) - radians(' . $session_lng . ')) + sin(radians(' . $session_lat . ')) * sin(radians(User.lat))))'; 
$conditions[] = $expression . ' < 100'; 
$this->controller->Paginator->settings = array(
    'fields' => array('Item.*', $expression.' as distance'), 
    'limit' => $limit, 
    'order' => array('Item.id' => 'Desc'), 
    'conditions' => $conditions, 
    'joins' => $joins, 
    'paramType' => 'querystring' 
); 

을 그래서, 당신이 볼 수 있듯이 내가 어디 상태로 다시 계산 된 필드를 넣어했다고. 누군가가 도움이되기를 바랍니다. 당신이 필드로 '거리'를 사용할 수 있습니다 그 후

$this->Business->virtualFields = array(
'distance' => '(6371 * acos(cos(radians(' . $location['Location']['latitude'] . ')) * cos(radians(Business.latitude)) * cos(radians(Business.longitude) - radians(' . $location['Location']['longitude'] . ')) + sin(radians(' . $location['Location']['latitude'] . ')) * sin(radians(Business.latitude))))' 
); 

:

0

이 경우의 솔루션은 가상 필드를 사용하는 것입니다

$this->Paginator->settings = array(
    'limit' => 20, 
    'order' => array('Business.distance' => 'ASC'), 
    'conditions' => array('Business.distance <=' => 100) 
); 

$data = $this->Paginator->paginate('Business'); 

현재 CakePHP의 가상 필드에 대한 자세한 내용을보실 수 있습니다 : http://book.cakephp.org/2.0/en/models/virtual-fields.html