Laravel-datatables: Langsame Leistung

Erstellt am 12. März 2018  ·  8Kommentare  ·  Quelle: yajra/laravel-datatables

Zusammenfassung des Problems oder der Funktionsanforderung

Langsame Leistung beim Laden von 537 Datensätzen
Laden auf Seite: 4,34 Sekunden
auf paginieren: 3,98 Sekunden

"pageLength": 10
Gibt es eine Möglichkeit, Zeilen pro Seite wie 10 aus der Abfrage zu begrenzen, als wenn die Paginierung von datable verwendet wird, werden die anderen 10 geladen ... wie die eingebaute Laravel-Paginierung

PS: Auch wenn die Paginierung deaktiviert ist, beträgt die Ladezeit immer noch 4,34 Sekunden

Code-Snippet des Problems

Controller

public function membresData()
    {

        $membres = Membre::
        join('equipes', 'equipes.id', '=', 'membres.equipe_id')
        ->join('laboratoires', 'laboratoires.id', '=', 'equipes.laboratoire_id')
        ->join('etablissements as e1', 'e1.id', '=', 'laboratoires.etablissement_id')
        ->leftjoin('etablissements as e2', 'e2.id', '=', 'membres.etablissement_id')
        ->leftjoin('profils', 'profils.id', '=', 'membres.profil_id')
        ->leftjoin('typemembres', 'typemembres.id', '=', 'membres.typemembre_id')
        ->select ('membres.id','equipes.axe_recherche','laboratoires.libelle','laboratoires.periode_accreditation_dd','laboratoires.periode_accreditation_df','e1.abbreviation as etablab','membres.nom', 'membres.prenom', 'membres.cv', 'membres.sujet', 'e2.abbreviation as etabmem', 'profils.typeprofil', 'membres.cin', 'membres.email','typemembres.typemembre')
        ->orderBy('axe_recherche', 'asc')
        ->get();

        if(request()->ajax()){
        return Datatables::of($membres)

         ->addColumn('name', 
                '{{$nom}} {{$prenom}}'
            )

         ->addColumn('cv', function ($membre) {
            if ($membre->cv != null){
            $url=url("uploadedCvMembre/$membre->etablab/$membre->cv");
            return '<div data-provide="photoswipe">
                        <img class="avatar avatar-sm cursor-pointer" src="'.$url.'" alt="Curriculum vitae de : '.$membre->prenom.' '.$membre->nom.'" data-provide="tooltip" data-original-title="Curriculum vitae" data-tooltip-color="primary" aria-describedby="tooltip946475">

                    </div>   ';
            }        
         })

         ->addColumn('laboratoire',
                '« {{$etablab}} » {{ $libelle }} <small>{{ \Carbon\Carbon::parse($periode_accreditation_dd)->format("Y") }} - {{ \Carbon\Carbon::parse($periode_accreditation_df)->format("Y") }}</small>'
            )

         ->addColumn('action', 
            '<nav class="nav gap-1 fs-16">


                            <a class="nav-link disabled hover-warning" data-provide="tooltip" data-tooltip-color="warning" data-original-title="Modifier" href="{{route("membre.edit",$id)}}"><i class="ti-pencil"></i></a>



                            <form method="POST" action="{{ action("MembreController@destroy", ["id" => $id]) }}" class="delete_form">
                            <strong i="16">@csrf</strong>
                            @method("DELETE")
                            <a class="nav-link disabled hover-danger delete-btn" data-provide="tooltip" data-tooltip-color="danger" data-original-title="Supprimer" href="#"><i class="ti-trash"></i></a>
                            </form>


            </nav>'
        )

         ->rawColumns(['cv','laboratoire','action'])
         ->make(true);
        }else{
            abort('404');
        }

Js

app.ready(function(){
        $("#dtable").dataTable().fnDestroy();
        $('#dtable').DataTable({
        "columnDefs": [
            { "visible": false, "targets": [0,1] },
            { "orderable": false, "targets": [-1] }
        ],
        "order": [[ 1, 'asc' ]],
        processing: true,
        serverSide: true,
        ajax: '{!! route('membres') !!}',
        deferRender: true,
        columns: [
            { data: 'laboratoire', name: 'laboratoire' },
            { data: 'axe_recherche', name: 'axe_recherche' },
            { data: 'name', name: 'name' },
            { data: 'cv', name: 'cv', orderable: false, searchable: false },
            { data: 'sujet', name: 'sujet' },
            { data: 'etabmem', name: 'etabmem', orderable: false, searchable: false },
            { data: 'typeprofil', name: 'typeprofil' },
            { data: 'cin', name: 'cin' },
            { data: 'email', name: 'email' },
            { data: 'typemembre', name: 'typemembre' },
            { data: 'action', name: 'action', orderable: false, searchable: false}

        ],
        "drawCallback": function ( settings ) {
            $('[data-provide~="tooltip"]').each(function(){var b="";$(this).hasDataAttr("tooltip-color")&&(b=" tooltip-"+$(this).data("tooltip-color")),$(this).tooltip({container:"body",trigger:"hover",template:'<div class="tooltip'+b+'" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>'})});
            var api = this.api();
            var rows = api.rows( {page:'current'} ).nodes();
            var last=null;

            api.column(0, {page:'current'} ).data().each( function ( group, i ) {
                if ( last !== group ) {
                    $(rows).eq( i ).before(
                        '<tr class="group bl-3 br-3 border-primary bg-light text-center" ><td class="fw-500" colspan="9">'+group+'</td></tr>'
                    );

                    last = group;
                }
            } );
            api.column(1, {page:'current'} ).data().each( function ( group, i ) {
                if ( last !== group ) {
                    $(rows).eq( i ).before(
                        '<tr class="group bl-3 border-warning bg-light" ><td class="fw-500" colspan="9">Equipe : '+group+'</td></tr>'
                    );

                    last = group;
                }
            } );

        }
    });


  });

Systemdetails

Bitte geben Sie diese Angaben zu Ihrem System an! Wenn sie weggelassen werden, wird das Ticket gegenüber den Anforderungen / Tickets anderer Benutzer priorisiert.
  • Betriebssystem Ubuntu 17.10
  • PHP 7.2.2
  • Laravel 5.6
  • Laravel-Datatables 8.4
performance question

Hilfreichster Kommentar

Verwenden Sie die Abfrage anstelle der Erfassung, indem Sie get() aus Ihrer Datenquelle entfernen.

>orderBy('axe_recherche', 'asc')
        ->get(); // remove this line.

Alle 8 Kommentare

Verwenden Sie die Abfrage anstelle der Erfassung, indem Sie get() aus Ihrer Datenquelle entfernen.

>orderBy('axe_recherche', 'asc')
        ->get(); // remove this line.

@yajra Danke Problem gelöst

Hallo, kannst du erklären, warum Abfragen viel schneller sind als Sammeln?

Weil es den Rest der Funktionen für die Abfrage ausführt, anstatt jedes Ergebnis und seine Unterdaten abzurufen und zu versuchen, die Funktionen für das auszuführen, was weniger effizient ist.

Die Reaktionszeit ist langsam
Seitenladen: 13.40s
Paginierung: 9s
Code-Auszug

Regler

öffentliche Funktion lending_return_log_server_side ()
{
$ alluser = Session :: get ('alluser');
$ reference = $ this-> database-> getReference ('lending_return_log') -> getSnapshot () -> getValue ();
$ reference = array_reverse ($ reference);
$ data = [];
$ name = '';
$ email = '';
foreach ($ reference als $ lending_return_log) {
// dd ($ lending_return_log ['uid']);
foreach ($ alluser als $ key => $ value) {
if ($ key == $ lending_return_log ['uid']) {
$ name = $ value ['Benutzername'];
$ email = $ value ['email'];
}}
}}
$ nestedData ['user_info'] = " ". ""
". $ email."
". $ lending_return_log ['lending_log_id'];
$ nestedData ['time_and_trx_id'] = \ Carbon \ Carbon :: parse ($ lending_return_log ['time']) -> format ('F j, Y, g: i a'). "
". $ lending_return_log ['trxid']." ";
$ nestedData ['back_amount'] = " " .number_format ($ lending_return_log ['amount_back_nob'], 8). "NOB ";
$ nestedData ['Closing_balance'] = " " .number_format ($ lending_return_log ['final_balance_nob'], 8). "NOB ";
$ nestedData ['nob_price'] = $ lending_return_log ['nob_price_at']. "$";
$ nestedData ['curr_return'] = " " .number_format ($ lending_return_log ['return_of_cur'], 8). "". $ lending_return_log ['cur_type']. " ";

        $data[] = $nestedData;
    }
    // $reference = collect($reference);

    $finalData = Datatables::of($data)->rawColumns(['user_info', 'time_and_trx_id', 'back_amount', 'closing_balance', 'nob_price', 'curr_return'])->make(true);
    return $finalData;
}

JS

(function () {
$ ('# table'). DataTable ({
Verarbeitung: wahr,
serverSide: true,
ajax: '{{url (' project-log-serverside ')}}',
Säulen: [
{Daten: 'user_info', Name: 'user_info'},
{data: 'time_and_trx_id', name: 'time_and_trx_id'},
{Daten: 'back_amount', Name: 'back_amount'},
{Daten: 'Closing_balance', Name: 'Closing_balance'},
{Daten: 'nob_price', Name: 'nob_price'},
{Daten: 'curr_return', Name: 'curr_return'},
]]
});
});

Paketversionen
Laravel 5.7
PHP: 7.2
Laravel Datatable: 8.13.7
Datenbank: NoSql DB (Firebase)

Können Sie bitte, was daran falsch ist?
Vielen Dank

Überprüfen Sie Ihre Indizierung

Regler:
$ trade1 = Tradecum3 :: where ('CODE', Auth :: user () -> ucc_code) -> where ('SCPOPT', '! =', 'EX') -> select ('UNIQUEID', 'CODE' , 'TRDATE', 'BS', 'SCPOPT as INSTTYPE', 'SCPCODE', 'SCPNAME', 'DUEDATE', 'STRIKERATE', 'MKTRATE', 'QTY', DB :: raw ('ABS (MKTRATE * QTY') ) als MKTTOTAL '));

    $trade2 = Tradecum2::where('CODE', Auth::user()->ucc_code)->where('SCPOPT', '!=', 'EX')->select('UNIQUEID', 'CODE', 'TRDATE', 'BS', 'SCPOPT as INSTTYPE', 'SCPCODE', 'SCPNAME', 'DUEDATE', 'STRIKERATE', 'MKTRATE', 'QTY', DB::raw('ABS(MKTRATE * QTY) as MKTTOTAL'));

    $trade = Tradecum1::where('CODE', Auth::user()->ucc_code)->where('SCPOPT', '=', 'EQ')->select('UNIQUEID', 'CODE', 'TRDATE', 'BS', 'SCPOPT as INSTTYPE', 'SCPCODE', 'SCPNAME', 'DUEDATE', 'STRIKERATE', 'MKTRATE', 'QTY', DB::raw('ABS(MKTRATE * QTY) as MKTTOTAL'))->union($trade1)->union($trade2);


    return DataTables::of($trade)
      ->addColumn('INSTNAME', function ($trade) {
       return $trade->SCPNAME."(". $trade->SCPCODE.")";
      })
      ->editColumn('INSTTYPE',function($trade){
        if($trade->INSTTYPE == "CE")
          return "Call Opt";
        else if ($trade->INSTTYPE == "PE")
          return "Put Opt";
        else if ($trade->INSTTYPE == "CF")
          return "Futures(EQ)";
      else if ($trade->INSTTYPE == "IF")
        return "Futures(INDEX)";
      else
        return $trade->INSTTYPE;
      })
  ->rawColumns(['INSTNAME'])
    ->make(true);

Aussicht:
$ ('# latestTradeTableAll'). DataTable ({
Verarbeitung: wahr,
serverSide: true,
zerstören: wahr,
Ajax: {
URL: "{{route ('datatable.trades')}}",
Typ: 'POST',
Überschriften: {
'X-CSRF-TOKEN': $ ('meta [name = "csrf-token"]'). Attr ('content')
},
Daten: Funktion (d) {

                d.instrumentType = $("input[name='instrumentType']:checked").val();
                d.transaction_type = $("input[name='transaction_type']:checked").val();
            }
        },
        columns: [{
                data: 'TRDATE',
                name: 'TRDATE'
            },
            {
                data: 'BS',
                name: 'BS'
            },
            {
                data: 'INSTNAME',
                name: 'INSTNAME'
            },
            {
                data: 'STRIKERATE',
                name: 'STRIKERATE'
            },
            {
                data: 'INSTTYPE',
                name: 'INSTTYPE'
            },
            {
                data: 'DUEDATE',
                name: 'DUEDATE'
            },
            {
                data: 'MKTRATE',
                name: 'MKTRATE'
            },
            {
                data: 'QTY',
                name: 'QTY'
            },
            {
                data: 'MKTTOTAL',
                name: 'MKTTOTAL'
            }
        ]
    });

get () lädt alle Daten und pageLength funktioniert nicht. Das obige lädt alle Datensätze.

Verwenden Sie die Abfrage anstelle der Erfassung, indem Sie get() aus Ihrer Datenquelle entfernen.

>orderBy('axe_recherche', 'asc')
        ->get(); // remove this line.

Dadurch stieg meine Anfrage von 20 Sekunden auf unter 2. Vielen Dank!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen