下面是我在模型上的一个函数,该函数返回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]);
}
达到这个目标的最佳目标是什么?
答案 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();