Я занимаюсь разработкой приложения с использованием CakePHP 1.3. У меня есть страница, которая позволяет пользователям выполнять поиск по записям таблицы «Outlet».
У меня есть три поля в форме поиска; имя , кухня и почтовый индекс . Вот как выглядит вид для поиска; 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.
Функциональность поиска почти работает так, как ожидалось, однако я заметил, что при поиске только по расстоянию (т. Е. Ввод почтового индекса в поле поиска и оставление двух других полей пустыми) Розетки, которые находятся менее чем в одной миле от данного почтового индекса, не извлечено из БД. Я не могу понять, почему это так.
Если я введу данные в форму поиска для любого из двух других полей ( имя и кухня ) И действительный почтовый индекс, чем все извлекаются совпадающие записи, включая те, которые находятся менее чем в одной миле. Я не могу понять, почему это не происходит в предыдущем случае.
Вот запросы, когда вводится только почтовый индекс; http://pastebin.com/37A0SP7G
Вот запросы, когда предоставляется почтовый индекс и текст вводится в поле имени; http://pastebin.com/a2mR7Yi0.
Я сформировал свой запрос Haversine, следуя руководству Google; 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 ) ) ) )';