简体   繁体   中英

CakePHP - Special query in Pagination

I'd like to paginate using a Circular query on MySQL, namely this:

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;

Unfortunately, I see the Pagination component only works through some query builder.

Is there a way I can use this query in a pagination anyway?

So, it turns out you can add virtual fields after the class declaration, like so:

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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM