2014-03-30 122 views
5

MySQL有用於獲取記錄的查詢將返回沒有限制,SQL_CALC_FOUND_ROWS總數的特徵。 Laravel是否支持這一點?使用Laravel獲取記錄總數?

目前,我必須這樣做,在兩個查詢:

public function dataTable() { 
    $bookings = DB::table('bookings') 
     ->limit(Input::query('iDisplayLength')) 
     ->offset(Input::query('iDisplayStart')) 
     ->get(); 
    $count = $bookings = DB::table('bookings') 
     ->count(); 
    return Response::json([ 
     'iTotalRecords' => $count, 
    ]); 
} 

這不僅效率較低,但也將是大量的冗餘代碼,一旦我在所有的->where()標準添加。

+0

你想讓這個解決方案Laravel DataTable的包?如果有的話,有一個基本的解決方案。 – Yilmazerhakan

+0

@Yilmazerhakan不,謝謝。這看起來過於複雜,我的需求。我不介意知道他們是如何做的 - 他們都是單獨的問題嗎? – mpen

回答

4

對於任何複雜的或特定供應商的查詢,您通常需要直接與DB::raw()通過查詢,例如:

$bookings = DB::table('bookings') 
    ->select(DB::raw('SQL_CALC_ROWS_FOUND ... 
+1

感謝您的提示,但我將無法像這樣使用它。 'SQL_CALC_FOUND_ROWS'後面不能有逗號,Laravel增加了'SQL_CALC_FOUND_ROWS',因爲它認爲它是一個常規列。 – mpen

+0

laravel不添加逗號。 – itachi

+0

@itachi:好東西,因爲它產生的SQL是 「選擇SQL_CALC_FOUND_ROWS,'created_at','first_name',從'bookings'限制'last_name' 25偏移0」,這是一個SQL錯誤。 – mpen

2

精製什麼@giaour說。

$bookings = DB::table('bookings') 
      ->select(array(DB::raw('SQL_CALC_FOUND_ROWS booking_id,name'))) 
      ->where('...') 
      ->orWhere('...') 
      ->take(10) 
      ->skip(50) 
      ->get(); 

$bookingsCount = DB::select(DB::raw("SELECT FOUND_ROWS() AS Totalcount;")); 

SQL_CALC_FOUND_ROWS後,您可以通過SQL_CALC_FOUND_ROWS(取數);

1

我遇到了這個問題,因爲我想分頁的一組結果已經包含了一個GROUP BY,而Laravel的內置paginate()方法使用了COUNT(*),並且不適用於GROUP BY。

所以我結束了擴展生成器類注入SQL_CALC_FOUND_ROWS查詢運行正確之前,右後運行FOUND_ROWS。我通過覆蓋Laravel的getModels()方法來做到這一點。

我已經uploaded the code here