提问者:小点点

Laravel Eloquent-如何将作用域查询中的计算值作为模型列或集合属性返回


我试图获得一个靠近已验证用户的用户列表,并使用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对象上?

谢啦!


共1个答案

匿名用户

这是因为您在一个不正确的范围内使用get()。 本地作用域旨在定义公共约束集(如用于筛选数据)。 有关更多详细信息,请查看有关本地作用域的文档。

要向select结果添加某些内容,可以使用AddSelect。