如何将派生表与laravel的查询构建器和范围一起使用?

时间:2015-10-10 17:37:07

标签: php laravel query-builder

我正在使用的软件包为模型添加了一个特征,允许您使用存储在模型中的纬度和经度值以及给定的纬度/经度点来查询附近的位置。它通过在特征中定义查询范围来实现这一点。

但是,生成的查询仅适用于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通常会自动添加该约束。

0 个答案:

没有答案