扩展 Eloquent 查找

Extending Eloquent find

这可能是个愚蠢的问题,但由于我对 Eloquent 不是很熟悉,所以我真的不知道如何搜索它(而且我所有的资源都没有提供我有办法完成我所追求的)。

基本上 - 我习惯在原生中做这样的事情 PHP:

$dummy = new Model(); $results = $dummy->find(['some criteria']);

我可以根据给定的模型对给定的标准进行参数化。在现实生活中,我想从 lat/lon.

中找到 radius 内的所有 Location

我知道我可以做到Location::where([query here for finding]),但是当radius在某个时候发生变化时,我将不得不找到所有使用它的地方并进行更改。对我来说,更优雅的解决方案是这样做:

static public function locate($params = array())
{
    $find = self::query();

    if ($params['latitude'] && $params['longitude'])
    {
        // if radius is not given, use radius of 1km
        if (!isset($params['radius']))
            $params['radius'] = 1/111;

        $find->where(DB::raw('SQRT(POW(latitude - '.$params['latitude'].', 2) + POW(longitude - '.$params['longitude'].', 2))'), '<=', $params['radius']);
    }

    return $find;
}

然后将其用作:

Location::locate(['latitude' => $lat, 'longitude' => $lon])

如果我可以覆盖 find 就好了,但我认为这并不容易实现。

但是,归结为一个问题——这种做法有多明智?是否有 Laravel 方法来完成我所描述的事情?

这种方法的问题是,如果您要覆盖内置函数,您将完全删除通过 lon/lat 搜索某些内容的功能,因为无论何时它都会在条件是你要搜索 lon/lat.

半径范围内的东西

我个人建议使用范围:

public function scopeWithin($query, $lon,$lat,$radius=1/111) {
     return $query->where(DB::raw('SQRT(POW(latitude - '.$lat.', 2) + POW(longitude - '.$lon.', 2))'), '<=', $radius);
}

并像这样使用它:

Location::within($lon,$lat)->where(more stuff);