使用Laravel QueryBuilder“when”并向Query结果添加自定义值

时间:2017-05-13 17:32:49

标签: php sql laravel laravel-query-builder

我想做的很简单: - 当计算的距离取决于用户的纬度和经度(在DB上)高于int时,我们通过添加where来从结果中删除当前用户 - 当该距离不高时,我们将自定义值添加到返回的结果

执行查询后,可以使用foreach轻松完成此操作:

%{} in {file()} and %{} =~ {file()}

这种方式的缺点是,如果我们有一个大型数据库,它将消耗大量的内存和时间,因为我们做两次直接在查询中应该做的事情。

我需要做的是在查询本身上执行此操作。我不知道该怎么做: - 在执行查询时直接向查询添加自定义值,并在查询中的when内进行距离计算,而不使用foreach但直接获取当前原始值以进行比较。

我现在在做什么:

foreach($search as $key => $value){
            if(distance($value->latitude,$value->longitude,$user->latitude,$user->longitude,"K") > $distance) {
                unset($search[$key]);
            } else {
            $search[$key]->distance = $calculatedDistance
        }
        }

->when($distance > 0, function ($query) use($distance, $longitude, $latitude){ $query->where(function ($subQuery) use ($longitude, $latitude,$distance) { $cDistance = distance((int)$subQuery->value('latitude'), (int)$subQuery->value('longitude'), $latitude, $longitude, "K"); $subQuery->when(($cDistance > $distance), function ($subQuery){ $subQuery->where('users.id', '<>', (int)$subQuery->value('id')); },function ($subQuery) use ($cDistance) { $subQuery->value((string)$cDistance.' as distance'); } ); }); 仅使用查询的第一个原始测试,而不是对所有行执行此操作。 $subQuery->value('something')正在返回错误

  

SQLSTATE [42S22]:找不到列:1054未知列   “字段列表”中的'84 .354917445764'(SQL:选择$subQuery->value((string)$cDistance.' as distance');84为   来自354917445764限制1)的distance

1 个答案:

答案 0 :(得分:0)

$sqlDistance = DB::raw('ROUND ( 6371 * acos( cos( radians(' . $latitude . ') ) 
                            * cos( radians( doctor_profile.latitude ) ) 
                            * cos( radians( doctor_profile.longitude ) 
                            - radians(' . $longitude . ') ) 
                            + sin( radians(' . $latitude . ') ) 
                            * sin( radians( doctor_profile.latitude ) ) ) )');

在查询中:

->selectRaw("{$sqlDistance} AS distance")
            ->when($distance > 0, function ($query) use ($distance,$sqlDistance){
                    $query->havingRaw('{$sqlDistance} <= ?', [$distance]);
                })