CakePHP 1.3 を使用してアプリケーションを開発しています。ユーザーが「アウトレット」テーブル レコードを検索できるページがあります。
検索フォームには 3 つのフィールドがあります。名前、料理、郵便番号。検索用のビューは次のようになります。http://pastebin.com/vadS4gcb。
郵便番号フィールドのみの検証を設定しました。空のままにすることもできますが、値を入力すると、CakePHP に組み込まれている郵便番号検証ルールが適用されます。これは、Outlets コントローラーで検索アクションがどのように見えるかです。http://pastebin.com/jiPUehkv .
ユーザーが検索フィールドに有効な郵便番号を入力すると、Outlets テーブルから一致するレコードが取得され、ユーザーが入力した郵便番号からの距離 (マイル) とともに検索結果ページに表示されます。検索機能を実装するために CakeDC の検索プラグインを使用しましたhttp://cakedc.com/downloads/view/cakephp_search_plugin。
私の Outlet モデル クラスは次のようになります。http://pastebin.com/yJ1HykTT .
検索機能はほぼ期待どおりに機能しますが、距離だけで検索すると (つまり、検索フィールドに郵便番号を入力し、他の 2 つのフィールドを空白のままにすると)、指定された郵便番号から 1 マイル未満のアウトレットは検索されないことに気付きました。 DB。これがなぜなのかわかりません。
他の 2 つのフィールド (名前と料理)のいずれかの検索フォームにデータを入力し、有効な郵便番号を入力 すると、1 マイル以内のレコードを含むすべての一致するレコードが取得されます。なぜこれが前のケースで起こっていないのか分かりません。
郵便番号のみが入力された場合のクエリを次に示します。http://pastebin.com/37A0SP7G
以下は、郵便番号が提供され、名前フィールドにテキストが入力された場合のクエリです。http://pastebin.com/a2mR7Yi0。
Google のガイドに従って、Haversine クエリを作成しました。http://code.google.com/intl/hu-HU/apis/maps/articles/phpsqlsearch.html私に与えた:
'( 3959 * acos( cos( radians("'.$latLong['latitude'].'") ) * cos( radians( Outlet.latitude ) ) * cos( radians( Outlet.longitude ) - radians("'.$latLong['longitude'].'") ) + sin( radians("'.$latLong['latitude'].'") ) * sin( radians( Outlet.latitude ) ) ) )';