php - Laravel/DataTable 无法显示约 80,000 行

标签 php laravel datatable large-data-volumes

我尝试使用 DataTables 进行服务器端处理来显示 80,000 行(分页),但 Laravel 崩溃并出现错误:

PHP fatal error :第 291 行/Users/fin/Documents/dev/evway-new/vendor/nesbot/carbon/src/Carbon/Carbon.php 中的最大执行时间超过 300 秒.

这是我获取行的 Controller 方法:

public function data()
{
    $employees = Employee::get(); // ~80,000 employees

    return Datatables::of($employees)
        ->edit_column('created_at',function(Employee $employee) {
            return $employee->created_at->diffForHumans();
        })
        ->add_column('actions',function($employee){
            $actions = '<a href='. route('admin.employees.show', $employee->id) .'><i class="livicon" data-name="info" data-size="18" data-loop="true" data-c="#428BCA" data-hc="#428BCA" title="view employee"></i></a>
                        <a href='. route('admin.employees.edit', $employee->id) .'><i class="livicon" data-name="edit" data-size="18" data-loop="true" data-c="#428BCA" data-hc="#428BCA" title="update employee"></i></a>';

            $actions .= '<a href='. route('admin.employees.clone', $employee->id) .' data-target="#clone"><i class="livicon" data-name="plus" data-size="18" data-loop="true" data-c="#f56954" data-hc="#f56954" title="clone employee"></i></a>';

            $actions .= '<a href='. route('admin.employees.confirm-delete', $employee->id) .' data-toggle="modal" data-target="#delete_confirm"><i class="livicon" data-name="remove" data-size="18" data-loop="true" data-c="#f56954" data-hc="#f56954" title="delete employee"></i></a>';
            return $actions;
        }
    )
    ->make(true);
}

这是我正在配置 DataTable 的 JS:

$(function() {
        var table = $('#table').DataTable({
            processing: true,
            serverSide: true,
            ajax: '{!! route('admin.employees.data') !!}',
            columns: [
                { data: 'id', name: 'id' },
                { data: 'name', name: 'name' },
                { data: 'status', name: 'status' },
                { data: 'actions', name: 'actions', orderable: false, searchable: false }
            ]
        });
    });

我做错了什么?我是否以错误的方式从数据库中获取员工? get() 是一个坏主意吗?

最佳答案

我还没有真正使用过数据表插件,但你的第一个语句就是罪魁祸首。 $employees = Employee::get(); // ~80,000 employees .. 这会将所有 80k 记录加载到内存中。然后你将此集合传递给 Datatables::of()方法。我认为您应该使用 Datatables::of(Employee::query()) 而不是这个,我假设它将处理分页并仅加载所需数量的员工 -

关于php - Laravel/DataTable 无法显示约 80,000 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43911477/

相关文章:

java - 数据表if else语句显示

c# - 检查是否没有返回数据行

php - PHP 中 mysql_rollback() 函数有什么用?

javascript - jQuery各个函数的结果怎么办?

php - MySQL 重复键更新 + 受影响的行数

javascript - Laravel Passport 在 PostMan 上运行良好,但在 React Native 应用程序中返回 401?

php - Laravel Bootstrap 响应式主题导航栏在减少时重叠内容

php - Eloquent ORM 返回带有单个项目的集合

c# - SQL 批量复制截断十进制

PHP 函数 'return' 未返回