这可能是一个愚蠢的问题,但由于我并不熟悉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方式做我所描述的?
答案 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);