我正在使用的软件包为模型添加了一个特征,允许您使用存储在模型中的纬度和经度值以及给定的纬度/经度点来查询附近的位置。它通过在特征中定义查询范围来实现这一点。
但是,生成的查询仅适用于MySQL。我想改变它以使用派生表的更通用的想法。我知道以下查询有效:
select *
from (
select *,
(3959 * acos( cos( radians($lat) ) * cos( radians( places.lat ) )
* cos( radians( places.lng ) - radians($lng) )
+ sin( radians($lat) ) * sin( radians( places.lat ) ) ) ) AS distance
from (
select *
from places
where places.lat between $minLat and $maxLat
and places.lng between $minLng and $maxLng
) as places
where places.deleted_at is null
) sub
where distance <= $1
order by distance asc
显然,$lng
和$lat
是传递到查询范围方法的值,最小值和最大值是从这些值中计算出来的。
我在此处所做的任何尝试均基于DB::raw()
内的一个大$query->select()
,但我无法在正确的位置获取dele_at或from places
得到了最后的结论。
是否有人有使用Laravel查询构建器派生表的经验。
编辑:我最接近以下内容:
$distanceQuery = DB::table(DB::raw("(
select *
from {$this->getTable()}
where $latColumn between $minLat and $maxLat
and $lngColumn between $minLng and $maxLng
) as places"))
->select(DB::raw("*,
(
$meanRadius * acos(cos(radians($lat)) * cos (radians($latColumn))
* cos (radians($lngColumn) - radians($lng))
+ sin(radians($lat)) * sin (radians($latColumn)))
) as distance"))
->toSql();
return DB::table(DB::raw('(' . $distanceQuery . ') as sub'))
->select(DB::raw("*"))
->where('distance', '<=', $distance)
->orderBy('distance', 'asc');
但是这不包括其中deleted_at为null的约束,Laravel通常会自动添加该约束。