これは愚かな質問かもしれませんが、私は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])
が、私ドンそれが簡単に実行可能だとは思わない。
しかし、質問になる - どのように賢明なアプローチですか?私が記述していることを行うララベルの方法はありますか?
'find'はしかし何をするかではないこと。代わりに 'where'を上書きすることができます。私はそれが不合理だとは思わないが、おそらくクエリスコープが優れている。 – apokryfos
@apokryfos - 確かに 'find'は間違った関数です(私が使っていたフレームワークでは、findを使ってオブジェクトを検索するのではなく、IDでオブジェクトを検索するのがLaravelで行われていました)。私は 'query'をオーバーライドすることができると思っていますが、Eloquentのすべての関数がそれを使用しているので、フレームワークの残りの部分をどのように処理するのかは不明です。それでも実際に賢明なことがあれば、いくつかのガイドラインに感謝します。 – eithed
そのモデルでそれを上書きすると、リスクはそのモデルでのみ制限されますが、私の答えで述べたように、あなたは基本的にモデルでできることを制限しています(おそらく今は大丈夫ですが、 )。 – apokryfos