Laravel-datatables: Performances lentes

Créé le 12 mars 2018  ·  8Commentaires  ·  Source: yajra/laravel-datatables

Résumé du problème ou de la demande de fonctionnalité

Performances lentes lors du chargement de 537 enregistrements
au chargement de la page: 4,34 secondes
à la pagination: 3,98 secondes

"pageLength": 10
y a-t-il une possibilité de limiter les lignes par page comme 10 à partir de la requête que lors de l'utilisation de la pagination de datatable, il chargera les 10 autres ... comme la pagination laravel intégrée

PS: même si la pagination est désactivée, le temps de chargement est toujours de 4,34 secondes

Extrait de code du problème

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

        }
    });


  });

Détails du système

Veuillez inclure ces détails sur votre système! S'ils sont omis, le ticket sera dépriorisé par rapport aux demandes / tickets des autres utilisateurs.
  • Système d'exploitation Ubuntu 17.10
  • PHP 7.2.2
  • Laravel 5.6
  • Laravel-Datatables 8.4
performance question

Commentaire le plus utile

Utilisez la requête au lieu de la collection en supprimant get() de votre source de données.

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

Tous les 8 commentaires

Utilisez la requête au lieu de la collection en supprimant get() de votre source de données.

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

@yajra Merci problème résolu

salut pouvez-vous expliquer pourquoi la requête est beaucoup plus rapide que la collecte?

Parce qu'il exécute le reste des fonctions sur la requête au lieu d'obtenir chaque résultat et ses sous-données et d'essayer d'exécuter les fonctions sur ce qui est moins efficace.

Le temps de réponse est lent
chargement de la page: 13,40 s
pagination: 9s
Extrait de code

Manette

fonction publique lending_return_log_server_side ()
{
$ alluser = Session :: get ('alluser');
$ reference = $ this-> database-> getReference ('lending_return_log') -> getSnapshot () -> getValue ();
$ reference = array_reverse ($ reference);
$ data = [];
$ nom = '';
$ email = '';
foreach ($ reference as $ lending_return_log) {
// dd ($ lending_return_log ['uid']);
foreach ($ alluser as $ key => $ value) {
if ($ key == $ lending_return_log ['uid']) {
$ name = $ value ['nom d'utilisateur'];
$ 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

(fonction() {
$ ('# table'). DataTable ({
traitement: vrai,
serverSide: vrai,
ajax: '{{url (' project-log-serverside ')}}',
Colonnes: [
{données: 'user_info', nom: 'user_info'},
{données: 'time_and_trx_id', nom: 'time_and_trx_id'},
{données: 'back_amount', nom: 'back_amount'},
{données: 'closing_balance', nom: 'closing_balance'},
{données: 'nob_price', nom: 'nob_price'},
{données: 'curr_return', nom: 'curr_return'},
]
});
});

Versions de package
Laravel 5.7
PHP: 7,2
Laravel Datatable: 8.13.7
Base de données: NoSql DB (Firebase)

Pouvez-vous s'il vous plaît ce qui ne va pas?
Merci

Vérifiez votre indexation

Manette:
$ 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 ) comme 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);

Vue:
$ ('# recentTradeTableAll'). DataTable ({
traitement: vrai,
serverSide: vrai,
détruire: vrai,
ajax: {
url: "{{route ('datatable.trades')}}",
tapez: 'POST',
en-têtes: {
'X-CSRF-TOKEN': $ ('meta [name = "csrf-token"]'). Attr ('contenu')
},
données: fonction (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 () charge toutes les données et pageLength ne fonctionne pas .. ce qui précède charge tous les enregistrements.

Utilisez la requête au lieu de la collection en supprimant get() de votre source de données.

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

Cela a fait passer ma requête de 20 secondes à moins de 2. Merci!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

alejandri picture alejandri  ·  3Commentaires

shadoWalker89 picture shadoWalker89  ·  3Commentaires

sangnguyenplus picture sangnguyenplus  ·  3Commentaires

ghost picture ghost  ·  3Commentaires

hohuuhau picture hohuuhau  ·  3Commentaires