2017-05-11 2 views
1

Ich versuche Tables mit Server-Verarbeitung zu verwenden 80000 Zeilen (paginierte) angezeigt werden, aber Laravel stürzt mit dem Fehler:Laravel/Datatable nicht ~ 80.000 Zeilen bei der Anzeige

PHP Fatal error: Maximum execution time of 300 seconds exceeded in /Users/fin/Documents/dev/evway-new/vendor/nesbot/carbon/src/Carbon/Carbon.php on line 291.

Hier ist mein Controller-Methode, wo ich die Zeilen bin holen:

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); 
} 

und hier ist meine JS, wo ich bin Datatable konfigurieren:

$(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 } 
      ] 
     }); 
    }); 

Was mache ich falsch? Locke ich die Mitarbeiter falsch aus der DB? ist get() eine schlechte Idee?

+2

warum müssen Sie 80.000 Zeilen anzeigen? – Kristoff

+0

Nun, sie sind paginiert, so dass es nur 100 Zeilen gleichzeitig anzeigen sollte, aber es gibt eine Tabelle mit Mitarbeitern. der Kunde hat es angefordert. – f7n

+1

Ich habe nicht wirklich mit Datatable-Plugin gearbeitet Aber Ihre erste Aussage ist der Schuldige. '$ employees = Mitarbeiter :: get(); // ~ 80.000' Mitarbeiter .. Dies lädt alle 80k Datensätze in den Speicher. Und dann übergeben Sie diese Sammlung an 'Datatables :: of()' Methode. Stattdessen sollten Sie "Datatables :: of (Employee :: query())" verwenden, von dem ich annehme, dass es die Seitennummerierung übernimmt und nur die erforderliche Anzahl an Mitarbeitern lädt. – Ankit

Antwort

0

ich mit Datatable-Plugin Aber Ihre erste Aussage ist der Täter nicht wirklich funktioniert erhöhen sollte. $employees = Employee::get(); // ~80,000 employees .. Dies lädt alle 80k Datensätze in den Speicher. Und dann übergeben Sie diese Sammlung an Datatables::of() Methode. Statt dessen sollten Sie Datatables::of(Employee::query()) verwenden, von dem ich annehme, dass er die Seitennummerierung übernimmt und nur die erforderliche Anzahl an Mitarbeitern lädt -

0

Ich glaube, Sie php.ini

max_execution_time = 360  ; Maximum execution time of each script, in seconds (I CHANGED THIS VALUE) 
max_input_time = 120   ; Maximum amount of time each script may spend parsing request data 
;max_input_nesting_level = 64 ; Maximum input variable nesting level 
memory_limit = 128M 
Verwandte Themen