2016-03-04 39 views
0

我正在嘗試查找在Laravel 5.1中查詢的最乾淨的方法。我正在創建一個API,它將從MySQL數據庫返回一個JSON字符串。如果未提供過濾器,則忽略Laravel數據庫查詢中的「where」子句

我希望能有像

mydomain.com/api/courses 

一個URL,將返回所有我們的課程的JSON列表。並且我還希望能夠通過GET查詢參數,如

mydomain.com/api/courses?subject=BUS 

這將只返回商業課程。迄今爲止很基本。在我的控制器中,我有

$subject = \Request::input('subject'); 

if ($subject) {          //filter to only query parameters 
    $results = \DB::table('course_listings') 
        ->where('subject', $subject) 
        ->get(); 
} else {           //return all results 
    $results = \DB::table('course_listings')->get(); 
} 

但是,它似乎有點不必要地混亂,特別是如果我想開始添加額外的查詢參數。如果查詢參數爲空,我想要做的就是隻能忽略where()

$results = \DB::table('course_listings') 
    ->where('subject', $subject) //ignore this line if no $subject 
    ->get(); 

而出於性能的考慮,我也想避免加載所有的結果,然後再應用過濾器。 Laravel爲此建造了什麼?

回答

2

您可以將查詢保存到一個變量,然後只在您的if塊應用where

$subject = Request::input('subject'); 

$query = DB::table('course_listings'); 

if ($subject) { 
    $query->where('subject', $subject); 
} 

$results = $query->get(); 

如果你想完全放棄if語句,你可以這樣做:

$constraints = array_only(Request::input(), 'subject'); 

$results = DB::table('course_listings')->where($constraints)->get(); 
+0

啊,完美。對於每個額外的查詢參數,我只需要一個額外的'if'語句,對嗎? – cchapman

+0

@cchapman - 如果你有很多這樣的參數,可能使用'array_only'更好。 –

相關問題