当前位置: 首页 > 知识库问答 >
问题:

cakephp-如何构造此查询

蔺弘
2023-03-14

我使用cakephp2.3,并试图分页查询检索我的所有'工作'在一定的英里半径内。幸运的是,我找到了我认为我需要的查询,但是我在获取正确的数据时遇到了问题。

编辑,使每个“作业”记录都有一个lat和lng字段,另一个用户通过在搜索表单中输入自己的lat和lng值以及英里半径来执行搜索。在下面的代码中,php变量$lat$lng和$miles在我的分页器中是用户输入的搜索参数

我在这里找到的查询https://developers.google.com/maps/articles/phpsqlsearch_v3?hl=el-GR-应该看起来像:

    SELECT id, 
           ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance 
      FROM markers 
    HAVING distance < 25 
  ORDER BY distance LIMIT 0 , 20;

我在我的书页上写的是这样的:

$this->Paginator->settings = array(
                                'fields'=>array('id','( 3959 * acos( cos( radians(37) ) * cos(radians( '.$lat.' ) ) * cos( radians( '.$lng.' ) - radians(-122) ) + sin( radians(37) ) * sin(radians( '.$lat.' ) ) ) ) AS distance '),
                                'limit' => 20,
                                'group'=>'distance having distance < '.$miles
                                        );
$jobs = $this->Paginator->paginate('Job');

产生的sql看起来像:

SELECT `Job`.`id`, ( 3959 * acos( cos( radians(37) ) * cos(radians( 54.59728500000001 ) ) * cos( radians( -5.930119999999988 ) - radians(-122) ) + sin( radians(37) ) * sin(radians( 54.59728500000001 ) ) ) ) AS distance FROM `trainnation`.`jobs` AS `Job` LEFT JOIN `trainnation`.`users` AS `User` ON (`Job`.`user_id` = `User`.`id`) LEFT JOIN `trainnation`.`courses` AS `Course` ON (`Job`.`course_id` = `Course`.`id`) WHERE 1 = 1 GROUP BY distance having distance < 100 LIMIT 20

在我看来这是正确的,但根本没有任何信息。应该至少有9条记录在该位置100英里以内,但$jobs总是空的。

谁能看出我做错了什么?

共有2个答案

万知
2023-03-14

试试这个来计算距离,

$distance = ( 3959 * acos( cos( deg2rad(37) ) * cos(deg2rad( 54.59728500000001 ) ) * cos( deg2rad( -5.930119999999988 ) - deg2rad(-122) ) + sin( deg2rad(37) ) * sin(deg2rad( 54.59728500000001 ) ) ) );

第二件事是,您的联接表没有距离字段来表示您要获取的内容?

可能需要编辑您的问题并向观众阐明。

唐腾
2023-03-14

试试这个,我也有同样的问题。我删除了一些

SELECT id, 3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat))) AS distance 
FROM markers 
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;
 类似资料:
  • 我有一个目前看起来像这样的方法: 我的理解是这是错误的。所以现在我正在考虑修复它,它应该是这样的: . doOn成功将返回一个客户响应,我需要在调用Health之前实际检查响应中的内容。构建器::。 如果我调用. fletMap()而不是doOn成功,它会出现错误吗?或者我需要把它放在doOn成功中吗?如果我把它放在doOn成功中,似乎我需要做一个双重doOn成功(这不可能是正确的,是吗?): 此

  • 问题内容: 我试图将数据插入到具有表列 (名称,值) 与 并得到以下异常: 另外,我也不能使用本机查询插入记录: 抛出另一个异常: 问题是: 查询字符串有什么问题? 非常感谢。 问题答案: 我解决了这个问题。 根据此, JPA中没有INSERT语句。 但是我可以用本机查询解决这个问题:我错误地放置了一个多余的;在查询末尾,因此可以通过将其删除来解决问题。

  • QueryBuilder 提供了一个简便,流畅的 SQL 查询构造器。在不影响代码可读性的前提下用来快速的建立 SQL 语句。 QueryBuilder 在功能上与 ORM 重合, 但是各有利弊。ORM 更适用于简单的 CRUD 操作,而 QueryBuilder 则更适用于复杂的查询,例如查询中包含子查询和多重联结。 使用方法: // User 包装了下面的查询结果 type User stru

  • 简介 在 Swoft 中,数据库查询构造器为创建和执行数据库查询提供了一个方便的接口,它可用于执行应用程序中大部分数据库操作,且可在所有支持的数据库系统上运行。 Swoft 的查询构造器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。因此没有必要清理作为绑定传递的字符串。 你可以使用 DB::table('table') 得到一个 Builder 对象,也可以使用 Builder:

  • 简介 Hyperf 的数据库查询构造器为创建和运行数据库查询提供了一个方便的接口。它可用于执行应用程序中大部分数据库操作,且可在所有支持的数据库系统上运行。 Hyperf 的查询构造器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。因此没有必要清理作为绑定传递的字符串。 这里只提供一部分常用的教程,具体教程可以到 Laravel 官网查看。 Laravel Query Builde

  • CodeIgniter 提供了查询构造器类,查询构造器允许你使用较少的代码来在数据库中 获取、新增或更新数据。有时只需要一两行代码就能完成数据库操作。CodeIgniter 并不需要为每个数据表提供一个类,而是使用了一种更简单的接口。 除了简单,使用查询构造器的另一个好处是可以让你创建数据库独立的应用程序, 这是因为查询语句是由每个独立的数据库适配器生成的。另外,由于系统会自动对数据 进行转义,所