返回集合中的范围数据

时间:2017-07-18 20:09:49

标签: laravel laravel-5

下面是我在模型上的一个函数,该函数返回Service来自三个关系的数据。范围closeTo包含与我希望返回的服务的位置有关的数据,但它目前仅使用它来计算距离。

return Service::with(['relationship1', 'relationship2', 'locations'])
  ->whereHas('locations', function ($query) use ($latitude, $longitude, $radius){
    $query->closeTo($latitude, $longitude, $radius);
  })
->get();

$query->closeTo使用下面的函数,我想用第一个函数中的return发回距离数据。

public function scopeCloseTo($query, $latitude, $longitude, $radius = 25)
    {
      $haversine = "(3959 * acos(cos(radians($latitude))
                     * cos(radians(latitude))
                     * cos(radians(longitude)
                     - radians($longitude))
                     + sin(radians($latitude))
                     * sin(radians(latitude))))";
     return $query
        ->select(['id', 'ccg', 'ccg_code']) //pick the columns you want here.
        ->selectRaw("{$haversine} AS distance")
        ->whereRaw("{$haversine} < ?", [$radius]);
    }

达到这个目标的最佳目标是什么?

1 个答案:

答案 0 :(得分:1)

只需将closeTo语句作为Closure而不是字符串添加到您的预先加载:

return Service::with(['relationship1', 'relationship2',
       'locations' => function ($query) use ($latitude, $longitude, $radius){
    $query->closeTo($latitude, $longitude, $radius);
}])->whereHas('locations', function ($query) use ($latitude, $longitude, $radius){
    $query->closeTo($latitude, $longitude, $radius);
  })
->get();