【问题标题】:Get total number of records with Laravel?使用 Laravel 获取记录总数?
【发布时间】:2014-05-09 23:53:56
【问题描述】:

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() 标准,就会有很多冗余代码。

【问题讨论】:

  • 你想要这个 Laravel Datatable 包的解决方案吗?如果是的话,有一个基本的解决方案。
  • @Yilmazerhakan 不,谢谢。对于我的需求来说,这看起来过于复杂。我不介意知道它们是如何计算的——它们都是单独的查询吗?

标签: php mysql laravel laravel-4


【解决方案1】:

对于任何复杂的或特定于供应商的查询,您通常必须直接使用DB::raw() 传递查询,例如:

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

【讨论】:

  • 感谢您的提示,但我不能那样使用它。 SQL_CALC_FOUND_ROWS 之后不能有逗号,Laravel 会添加逗号,因为它认为它是一个常规列。
  • laravel 不加逗号。
  • @itachi:好吧,因为它生成的 SQL 是“select SQL_CALC_FOUND_ROWS, created_at, first_name, last_name from last_name from bookings limit 25 offset 0”,这是一个 SQL 错误.
  • 我试过DB::table('foo') ->select(array(DB::raw('SQL_CALC_FOUND_ROWS *'))) ->toSql();它返回select SQL_CALC_FOUND_ROWS * from `foo`
  • 哦...我在做->select(DB::raw('SQL_CALC_FOUND_ROWS'),'created_at',...)。我想我可以将所有行都放在原始位中。
【解决方案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() 获取计数;

【讨论】:

    【解决方案3】:

    我遇到这个问题是因为我想对已经包含 GROUP BY 的一组结果进行分页,而 Laravel 的内置 paginate() 方法使用 COUNT(*) 并且不适用于 GROUP BY。

    所以我最终扩展了 Builder 类以在运行查询之前注入 SQL_CALC_FOUND_ROWS,并在之后立即运行 FOUND_ROWS。我通过重写 Laravel getModels() 方法来做到这一点。

    我有uploaded the code here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多