1

CakePHP 2.2.4 で haversine 式を使用して距離を計算するときに、結果のリストをページ分割しようとしていますが、having 句の計算フィールドでエラーが発生します。

私はこれを理解しようと真剣に何週間も費やしましたが、できません。私はいくつかの投稿を読みました.countメソッドをオーバーライドする必要があると言っているものもあれば、他のことを試してみると言っているものもありますが、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',
        )
    )

そして、私が取得し続けるエラーは次のとおりです。

エラー: SQLSTATE [42S22]: 列が見つかりません: 1054 不明な列 'distance' in 'having clause'

助けてください!

4

2 に答える 2

0

この場合の解決策は、Virtual Fields を使用することです。

$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 ) ) ) )'
);

その後、「距離」をフィールドとして使用できます。

$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

于 2015-09-22T15:29:02.237 に答える