2016-09-07 15 views
0

関連性によってデータベースオブジェクトを注文する必要があります。妥当性は次のようなものです:rating/distance(lat0, lng0, lat, lng)複雑な順序でコードをモデルに挿入するにはどうすればよいですか?

MyModel::orderBy('rating/FUNC(:lat0, :lng0, lat, lng)', [$lat, $lng]) 

しかし、最初に、かなりの緯度は、式で2回出現しているので、別の引数があるように起こっている:

MyModel::orderBy('rating/FUNC(:lat0, :lng0, lat, lng)', [$lat, $lat, $lng]) 

第二に、それはない、私はおそらくコントローラで、このようにそれを行うことができますコントローラーでまったく同じように聞こえる音がします。そこで私がやりたい:

MyModel::orderByRelevance($lat, $lng) 

だから、私のアイデアは、ヘルパー関数sql_distance_to($lat_col_name, $lng_col_name)にSQL式を抽出することです。次に、もう1人のヘルパー:sql_distance_to_args($lat, $lng)を追加して、[$lat, $lat, $lng]を返します。最後のステートメントを可能にするために、この2つをモデルで使用します。あなたは何を言っていますか?それ、どうやったら出来るの?

答えて

1

あなたは、あなたのモデルのロジックを保つ&再利用可能なアプリケーション全体で、(Eloquent query scopesを参照してください)モデルでダイナミックスコープを定義することによって、これをアプローチすることができます

class MyModel extends Model { 

    public function scopeRelevance($query, $lat, $lng) 
    { 
     // Your relevancy calculation. 

     // Return query builder instance. 
     return $query->where('...'); 
    } 
} 

としてそれを使用する:

MyModel::relevance($lat, $lng)->get(); 
関連する問題