我试图获得一个靠近已验证用户的用户列表,并使用Laravel的Eloquent返回他们之间的距离。 我使用原始SQL使其正常工作,但现在我几乎可以使用Multimy Eloquent使其正常工作。
所以,在用户模型上,我有这样的方法:
public function getUsersAround($coordinates, $radius = 5)
{
return $this->whereHas('location', function ($query) use ($coordinates, $radius) {
$query->distance($coordinates, $radius);
})->paginate(10);
}
那么在位置模型上,我有如下的范围:
public function scopeDistance($query, $coordinates, $radius)
{
return $query
->join('profiles', 'profiles.id', '=', 'locations.profile_id')
->having('distance', '<', $radius)
->selectRaw("profile_id,
(6371 * ACOS(COS(RADIANS($coordinates->latitude))
* COS(RADIANS(latitude))
* COS(RADIANS(longitude) - RADIANS($coordinates->coordinates))
+ SIN(RADIANS($coordinates->latitude))
* SIN(RADIANS(latitude)))) AS distance")
->orderBy('distance', 'asc')
->get();
}
因此,radius中的所有用户都被正确返回,但我还想将计算出的距离添加到每个返回的用户中。
奇怪的是,如果我dd($query->distance($cordinations,$radiation));
,我会在每个用户对象上看到所有的用户+一个新的distance属性(具有正确的值),但是如果我只返回查询和控制器内的dd(auth()->user()->getUsersaround($cordinations,$radiation))
,distance属性就不再存在了。
有没有一种方法可以在范围查询内部返回计算出的距离,并在返回用户列表时将其持久化在Users对象上?
谢啦!
这是因为您在一个不正确的范围内使用get()。 本地作用域旨在定义公共约束集(如用于筛选数据)。 有关更多详细信息,请查看有关本地作用域的文档。
要向select结果添加某些内容,可以使用AddSelect。