扩展 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);
这可能是个愚蠢的问题,但由于我对 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);