【发布时间】:2020-10-20 17:53:33
【问题描述】:
我正在尝试获取经过身份验证的用户附近的用户列表,并使用 Laravel 的 Eloquent 返回他们之间的距离。我使用原始 SQL 让它工作,但现在我几乎可以使用大部分 eloquent 使其正常工作。
所以,在用户模型上我有这个方法:
public function getUsersAround($coordinates, $radius = 5)
{
return $this->whereHas('location', function ($query) use ($coordinates, $radius) {
$query->distance($coordinates, $radius);
})->paginate(10);
}
然后在 Location 模型上,我有以下范围:
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');
}
因此,半径内的所有用户都被正确返回,但我还想将计算出的距离添加到每个返回的用户。
奇怪的是,如果我 dd($query->distance($coordinates, $radius)); 我看到所有用户 + 每个用户对象上的新距离属性(具有正确的值),但如果我只是在控制器内返回查询和 dd(auth()->user()->getUsersAround($coordinates, $radius)),距离属性不存在了。
有没有办法在返回用户列表时返回范围查询内的计算距离并将其持久化到用户对象上?
谢谢!
【问题讨论】:
标签: mysql laravel eloquent model coordinates