我正在使用 CakePHP 1.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。
搜索功能几乎可以按预期工作,但是我注意到仅按距离搜索时(即在搜索字段中输入邮政编码并将其他两个字段留空)距离给定邮政编码不到一英里的网点不会从D B。我不明白为什么会这样。
如果我在搜索表单中为其他两个字段(名称和美食)中的任何一个输入数据和一个有效的邮政编码,那么所有 匹配的记录(包括那些距离不到一英里的记录)都会被检索到。我无法弄清楚为什么在前一个案例中没有发生这种情况。
以下是仅输入 postccode 时的查询;http://pastebin.com/37A0SP7G
以下是提供邮政编码并在名称字段中输入文本时的查询;http://pastebin.com/a2mR7Yi0。
我按照谷歌的指南形成了我的 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 ) ) ) )';