0

这是我在这个网站上的第一篇文章,所以请多多关照。

使用 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“有子句”中的未知列“距离”

SQL 查询: SELECT COUNT(*) AS countFROM velobuddiesrides作为Rides内部 JOIN velobuddiesride_typesAS RideTypesON ( RideTypes. id= Rides. ride_type) WHERE 1 = 1 GROUP BY Ridesid距离 < 5

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

那么这里发生了什么?

4

2 回答 2

0

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

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

于 2012-06-25T23:55:59.917 回答
0

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

于 2013-10-17T01:07:34.730 回答