$field = 'ACOS(SIN(('.$addr["lat"].' * 3.1415) / 180 ) *SIN((a.lat * 3.1415) / 180 ) +COS(('.$addr["lat"].' * 3.1415) / 180 )
* COS((a.lat * 3.1415) / 180 ) *COS(('.$addr["lng"].' * 3.1415) / 180 - (a.lng * 3.1415) / 180 ) ) * 6380 as distance';
$dot=Db::name('dot')
->alias('a')
->field($field.",dot_store_name,dot_door_photo,id,business_status,service_distance,xysm")
->where($where)
->having( "distance<=service_distance")
->order("distance asc")
// ->page($page,$limit)
->select();
thinkphp 5.1
mysql 5.7版本以上
https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html
$lists = appcarsmodelWash::fieldRaw("round(st_distance_sphere(point(".$data["longitude"].",".$data["latitude"]."),point(`longitude`,`latitude`))) distance ")
->where("status",1)
->orderRaw($order .",is_recommend desc")
->paginate();
原生sql
select shop.* from ( select * ,round(st_distance_sphere(point(120.012484,30.298926),point(`longitude`,`latitude`))) dis from test111.store having dis < 5000 order by dis limit 100000 ) shop group by shop.item_id order by dis limit 10