问题描述
我正在努力寻找附近的公司 这是我的查询
$lat = 21.41241750000001;
$long = 39.23094140625001;
return
$this->model->select('id','lat','long',DB::raw(sprintf(
'(6371 * acos(cos(radians(%1$.7f)) * cos(radians(`lat`)) * cos(radians(`long`) - radians(%2$.7f)) + sin(radians(%1$.7f)) * sin(radians(`lat`)))) AS `distance`',$lat,$long
)))
->having('distance','<',50)
->orderBy('distance','asc')
->paginate();
永远得到我
sqlSTATE [42S22]:找不到列:1054中的未知列'距离' “具有子句”(sql:从
companies
中选择count(*)作为聚合distance
= 50)
我的表架构
+-------------------+----------------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+----------------------------------------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name_en | varchar(191) | NO | | NULL | |
| name_ar | varchar(191) | NO | | NULL | |
| search_keywords | text | NO | | NULL | |
| status | enum('REJECTED','ACCEPTED','PENDING','DUPLICATED') | NO | MUL | PENDING | |
| rejection_reason | text | NO | | NULL | |
| industry | varchar(191) | NO | | NULL | |
| website | varchar(191) | NO | | NULL | |
| city_id | int(10) unsigned | YES | MUL | NULL | |
| zone_id | int(10) unsigned | NO | MUL | NULL | |
| size | int(11) | NO | | NULL | |
| lat | varchar(191) | NO | MUL | NULL | |
| long | varchar(191) | NO | | NULL | |
| formatted_address | text | NO | | NULL | |
| street | varchar(191) | NO | | NULL | |
| building | varchar(191) | NO | | NULL | |
| floor_no | int(10) unsigned | NO | | NULL | |
| landmarks | varchar(255) | NO | | NULL | |
| company_id | int(10) unsigned | YES | MUL | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+-------------------+----------------------------------------------------+------+-----+---------+----------------+
注意:如果我不进行查询并排序返回和计算的距离 有帮助吗?
解决方法
我有类似的问题。我根据您的情况调整了代码。您可以尝试addSelect。 我认为这段代码是您解决方案的起点:
$lat = 21.41241750000001;
$long = 39.23094140625001;
Companies::addSelect(['distance' => DB::raw(sprintf('(6371 * acos(cos(radians(%1$.7f)) * cos(radians(`lat`)) * cos(radians(`long`) - radians(%2$.7f)) + sin(radians(%1$.7f)) * sin(radians(`lat`)))) AS `distance`',$lat,$long))
])
->havingRaw('distance < 50')
->orderBy('distance','asc')
->get();
我无法测试;向我们发送反馈!
,我的问题出在paginate
上,所以我使用了get
,但我不知道为什么,所以任何人都可以解释这将是很棒的