2016-05-13 18 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);'in controller – 4Jean

回答

0

最簡單的方法是使用模型。只需編寫一個獲取關鍵字並將其解析爲sql查詢的方法。您可以使用範圍方法來提供更大的靈活性。即使你決定不使用範圍的方法

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

,我還是勸返回查詢生成器對象,而不是集合允許:

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 .'%'); 
} 

你可以在控制器中使用此方法一樣,以獲得更好的靈活性,例如在需要的地方實施分頁或在控制器中進行額外操作。

如果您不害怕添加更復雜的元素以獲得更大的靈活性,您還可以使用存儲庫。更多在這裏:https://laracasts.com/lessons/repositories-simplified