0

このサイトに投稿するのは初めてなので、よろしくお願いします。

find() メソッドを使用すると問題なく動作しますが、paginate コンポーネントを使用して実行しようとするとうまくいきません。フィールドオプションでHaversine式を実行して距離を計算しようとしています。Cake Book では、「fields などの他の 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 不明な列 'distance' in 'having clause'

SQL クエリ: SELECT COUNT(*) AS countFROM velobuddies. ridesASRides内部 JOIN velobuddiesride_typesAS RideTypesON ( RideTypes. id= Rides. ride_type) WHERE 1 = 1 GROUP BY Rides. id距離 < 5

繰り返しますが、これらすべてのまったく同じオプションを find('all') メソッドに適用すると、完全に機能するため、ロジックが正しいことがわかります...または少なくとも機能します。

それで、ここで何が起こっているのですか?

4

2 に答える 2

0

モデル名に問題があるようです。アプリケーションが CakePHP の正しい規則に従っている場合、Ride.Field の代わりに Ride.field を使用する必要があります。CakePHP クエリでは、テーブル名ではなくモデルを参照したいと考えています。

于 2013-10-17T01:07:34.730 に答える
0

Daniel この投稿は CakePHP 1.3 に基づいていますが、答えがあるかもしれません。集約に基づいてモデルをバインドする必要があります。

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

于 2012-06-25T23:55:59.917 に答える