2017-06-27 17 views
0

これは愚かな質問かもしれませんが、私はEloquentに精通していないので、私はそれを探し出す方法を本当に知りません(そして私が持っているすべてのリソースは私に私が何をしているかを達成する方法)。Eloquentの拡張

は、基本的には - 私はネイティブのPHPでこのような何かをやってするのに使用さだ:私は与えられたモデルに基づいた基準を与えられたパラメータ化でき

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

。現実のシナリオでは、からlat/lonまでのすべての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; 
} 

そしてとしてそれを使用する:私はfindをオーバーライドすることができればそれは素晴らしいことだ

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

が、私ドンそれが簡単に実行可能だとは思わない。

しかし、質問になる - どのように賢明なアプローチですか?私が記述していることを行うララベルの方法はありますか?

+0

'find'はしかし何をするかではないこと。代わりに 'where'を上書きすることができます。私はそれが不合理だとは思わないが、おそらくクエリスコープが優れている。 – apokryfos

+0

@apokryfos - 確かに 'find'は間違った関数です(私が使っていたフレームワークでは、findを使ってオブジェクトを検索するのではなく、IDでオブジェクトを検索するのがLaravelで行われていました)。私は 'query'をオーバーライドすることができると思っていますが、Eloquentのすべての関数がそれを使用しているので、フレームワークの残りの部分をどのように処理するのかは不明です。それでも実際に賢明なことがあれば、いくつかのガイドラインに感謝します。 – eithed

+0

そのモデルでそれを上書きすると、リスクはそのモデルでのみ制限されますが、私の答えで述べたように、あなたは基本的にモデルでできることを制限しています(おそらく今は大丈夫ですが、 )。 – apokryfos

答えて

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); 
+0

それはまさにそれです!これは私の問題のすべてを解決し、 'scope *'がそれらを分けるので、私はさらに機能を追加したい場合に関数 'locate'を拡張する必要はありません。どうもありがとうございました! – eithed