2016-05-13 7 views
0

検索スクリプトを作成していて、ユーザーのクエリに基づいて結果を返したいとします。laravelで検索ロジックを書き込む場所

私のルート以下の通りです: -

Route::get('/search/{city}/{searchquery}', '[email protected]'); 

コントローラ

public function search($city, $query){ 
    strtolower($query); 
    $commonWords = array('a','able','about','above','abroad'.....); 
    $cleanQuery = preg_replace('/\b('.implode('|',$commonWords).')\b/','',$query); 
    $cleanQuery = $s = preg_replace('/[^a-z0-9]+/i', ' ', $cleanQuery); 
    $queryarray = explode(' ',$cleanQuery); 
    $queryarray = array_filter($queryarray); 
    $queryarray = array_slice($queryarray, 0); 



    //code to match each query word with MySQL fields such as title, description 

    return $result; 
} 

私はこのすべてのロジックとコードがコントローラに書き込ますべきではない、と信じています。ロジックを書いてコントローラを使用して結果のみを返すには何が使えますか?

+0

ロジックをapp/modelsに配置して、コントローラ内で 'public function search($ city、$ query);を呼び出すことができます – 4Jean

答えて

0

最も単純な方法は、モデルを使用することです。キーワードを取得し、それをSQLクエリに解析するメソッドを書くだけです。スコープメソッドを使用すると、柔軟性を高めることができます。

public function scopeSearch($q, $keywords) 
{ 
    // ... $keywords processing here 
    $keywordsArray = explode(',', $keywords); 

    return $query->whereIn('keyword', $keywordsArray); 

    // OR maybe something like this? 
    return $query->where('keywords', 'LIKE', '%'. $keywords .'%'); 
} 

あなたはそのようなコントローラで、この方法を使用することができます。

$city = new City(); 
$results = $city->search($keywords)->where(/* additional conditions could be added here */)->get(); 

スコープのメソッドを使用しないと決めた場合でも、私はまだ代わりに、コレクションのクエリビルダオブジェクトを返すように助言できるようにすると必要に応じてコントローラにページネーションや追加の操作を実装するなど、柔軟性を高めることができます。

さらに複雑にすることを恐れていない場合は、リポジトリを使用して柔軟性を高めることもできます。これに関する詳細:https://laracasts.com/lessons/repositories-simplified

関連する問題