2017-05-11 110 views
1

我有一個控制器,它根據URL'request'參數返回一個SQL查詢。在這種情況下,如何動態更改sql查詢?

switch ($request->get('request')){ 
     case '3dvideo': 
      $students = Student::orderBy('year', 'desc')->where('orientation', '3D')->inRandomOrder()->paginate(12); 
      break; 
     case '2d': 
      $students = Student::orderBy('year', 'desc')->where('orientation', '2D')->inRandomOrder()->paginate(12); 
      break; 
     case 'web': 
      $students = Student::orderBy('year', 'desc')->where('orientation', 'web')->inRandomOrder()->paginate(12); 
      break; 
     case 'all': 
      $students = Student::orderBy('year', 'desc')->inRandomOrder()->paginate(12); 
      break; 
     default: 
      $students = Student::orderBy('year', 'desc')->inRandomOrder()->paginate(12); 
      break; 
    } 

現在我有第二個參數在我的網址(一年),我不知道如何根據這兩個參數做(如果今年存在的話),我回到這樣一個SQL查詢:

$students = Student::orderBy('year', 'desc')->where('orientation', 'web')->where('year', 'MY-YEAR')->inRandomOrder()->paginate(12); 

非常感謝您

回答

1

你可以做這樣的事情:

$students = Student::query(); 

if (in_array($request->request, ['3dvideo', '2d', 'web'])) { 
    $students = $students->where('orientation', $request->request); 
} 

if ($request->has('year')) { 
    $sudents = $students->where('year', $request->year); 
} 

$students = $students->latest('year')->inRandomOrder()->paginate(12); 
+0

謝謝!按年份排序適用於您的方法,但它忽略了方向參數,因此我每年爲所有學生進行康復,而不是以「3dvideo」方向爲例,所有學生一年 –

1

像那樣優化查詢。

$query = Student::orderBy('year', 'desc')->inRandomOrder(); 

    if($request->has('orientation')){ 
      query->where('orientation',$request->get('orientation')); 
    } 

    if($request->has('year')){ 
      query->where('year',$request->get('year')); 
    } 
    $student = $query->paginate(12);