2014-06-17 139 views
0

這裏是我的UserController @ getIndex,它輸出一些用戶和所有用戶數。Laravel雄辯緩存查詢條件

$name = Input::get('name'); 
$page = Input::get('page'); 
$limit = Input::get('limit'); 
$users = User::where('name', 'like', '%'.$name.'%') 
     ->orderBy('created_at', 'desc') 
     ->skip($limit*$page)->take($limit) 
     ->get(); 

return array(
    'rows'=>$users->toArray(), 
    'results'=>User::where('name', 'like', '%'.$name.'%')->count(), 
); 

有沒有什麼辦法可以重用'where()'部分,所以我不必重複我的自我?

回答

1

您可以使用query scopes不要重複自己:

//app/models/User.php 
public function scopeFilterName($query, $name) { 
    return $query->where('name', 'like', '%'.$name.'%'); 
} 

/////////////////////////// 

//in the controller 
$name = Input::get('name'); 
$page = Input::get('page'); 
$limit = Input::get('limit'); 
$users = User::filterName($name) 
     ->orderBy('created_at', 'desc') 
     ->skip($limit*$page)->take($limit) 
     ->get(); 

return array(
    'rows'=>$users->toArray(), 
    'results'=>User::filterName($name)->count(), 
); 
+0

謝謝,範圍是一個很好的方法來做到這一點。但是我認爲範圍應該用一些更「常見」的方式,比如「scopeFemale」或「scopeOld」。 此控制器響應管理面板,對於其他資源(如「訂單」),過濾器更復雜,它只是用於管理網格過濾器,僅用於此操作,所以有任何方便的方法嗎? – missingcat92

+0

範圍是推薦的,在我看來是實現這種方法的最簡單方法。我能想到的是在模型事件中使用boot()方法,並在那裏設置了條件where子句,但我沒有嘗試過,即使它成功了,它肯定會更復雜。 http://laravel.com/docs/eloquent#model-events – Arda

1

不是很方便的方法,但它會給你的生成器是如何工作的想法:

$query = User::where('name', 'like', "%{$name}%"); 
$anotherQuery = clone $query; 

$query->orderBy('created_at', 'desc') // you can use latest() method for this btw 
    ->skip(5) // sets OFFSET 5 
    ->take(10) // sets LIMIT 10 
    ->get(); 

現在,這些條款留在生成器,所以這將返回null:

$query->count(); 

因爲那OFFSET 5

所以,你可以使用:

$anotherQuery->count(); 

或:

$query->skip(0)->take(9999); 

甚至不太方便:

$query->getQuery() // get the base Query Builder object 
    ->limit = null; 
$query->getQuery()->offset = null; 

而只是說明 - 我不知道同意scope不是f它在這裏,我實際上會使用它。

+0

這是非常接近我想要的...如果我使用範圍這種情況下,這意味着對於大多數模型,將有一個函數scopeFilter(diffrentArgs )? – missingcat92

+1

範圍僅適用於其定義的模型。對於常見任務而言,這只是一個方便的DRY功能。 'filterName($ name)''''male()'''recentUpdated()'等等。你可以定義它但是適合你,它只是一組查詢約束。 –