MySQL具有获取查询将返回的记录总数而无限制SQL_CALC_FOUND_ROWS
的功能。 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 :(得分:4)
对于任何复杂或特定于供应商的查询,您通常必须直接使用DB::raw()
传递查询,例如:
$bookings = DB::table('bookings')
->select(DB::raw('SQL_CALC_ROWS_FOUND ...
答案 1 :(得分: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()获取计数;
答案 2 :(得分:1)
我遇到过这个问题,因为我想要对已经包含GROUP BY的一组结果进行分页,而Laravel的内置paginate()方法使用COUNT(*)并且不能与GROUP一起使用BY
所以我最终扩展了Builder类,在运行查询之前注入SQL_CALC_FOUND_ROWS,然后立即运行FOUND_ROWS。我通过覆盖Laravel getModels()方法来做到这一点。