扩展雄辩的发现

时间:2017-06-27 15:42:50

标签: php eloquent laravel-5.3

这可能是一个愚蠢的问题,但由于我并不熟悉Eloquent,所以我真的不知道如何搜索它(以及我所拥有的所有资源都没有。'为我提供了一种方法来完成我之后的事情。

基本上 - 我曾经在本机PHP中做过类似的事情:

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

我可以根据给定的模型参数化给定的标准。在现实生活中,我想找到Location / radius lat内的所有lon

我知道我可以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方式做我所描述的?

1 个答案:

答案 0 :(得分:1)

如果你要覆盖内置函数,那么这种方法的问题在于你完全删除了通过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);