CakePHP 2.0分页中的Haversine公式不起作用

时间:2012-06-25 20:55:52

标签: cakephp field distance paginate haversine

这是我在这个网站上的第一篇文章,所以请善待。

使用find()方法完成这项工作没有问题,但是当我尝试使用paginate组件运行它时,没有运气。我只是想在字段选项中运行Haversine公式来计算距离。在Cake Book中,它说“你还可以包含其他find()选项,例如字段:”。没有提到任何警告。

所以,这就是我想要运行的东西:

$this->paginate = array(
    'joins' => array(
        array(
            'table' => 'ride_types',
            'alias' => 'RideTypes',
            'type' => 'inner',
            'conditions'=>array('RideTypes.id = Rides.ride_type')
        )
    ),
    'group' => array(
        "Rides.id HAVING distance < $filter_radius AND ride_time >= '$filter_earliest_time' AND ride_time <= '$filter_latest_time' AND ride_date >= '$filter_earliest_date' AND ride_date <= '$filter_latest_date'"
    ),
    'fields' => array(
        "( 3959 * acos( cos( radians($filter_lat) ) * cos( radians( Rides.lat ) ) * cos( radians( Rides.lng ) - radians($filter_lng) ) + sin( radians($filter_lat) ) * sin( radians( Rides.lat ) ) ) ) AS distance"
    ),
    'limit' => 5,
    'page' => $paginate_page,
    'order' => array('Rides.start_time DESC'),
);

$rides = $this->paginate('Rides',$options['conditions']);

我收到此错误:

错误:SQLSTATE [42S22]:未找到列:1054'having子句'中未知列'距离'

SQL查询:SELECT COUNT(*)AS count FROM velobuddiesrides AS Rides内部加入velobuddiesride_types AS { {1}} ON(RideTypesRideTypes = idRides)WHERE 1 = 1 GROUP BY ride_typeRides距离

同样,如果我将所有这些完全相同的选项应用于find('all')方法,它可以完美地工作,所以我知道逻辑是正确的......或者至少是可行的。

那么这里发生了什么?

2 个答案:

答案 0 :(得分:0)

丹尼尔这篇文章可能有答案,尽管它基于CakePHP 1.3。它涉及基于聚合绑定模型。

http://cakephp.1045679.n5.nabble.com/Pagination-with-HasMany-and-SQL-Aggregation-td1307450.html

答案 1 :(得分:0)

您的型号名称可能存在问题。如果您的应用程序遵循正确的CakePHP约定,那么您应该使用Ride.field而不是Rides.Field。在CakePHP查询中,您要引用模型而不是表名。