Laravel-datatables: أداء بطيء

تم إنشاؤها على ١٢ مارس ٢٠١٨  ·  8تعليقات  ·  مصدر: yajra/laravel-datatables

ملخص المشكلة أو طلب الميزة

أداء بطيء عند تحميل 537 سجل
عند تحميل الصفحة: 4.34 ثانية
عند ترقيم الصفحات: 3.98 ثانية

"pageLength": 10
هل هناك أي احتمال لتقييد عدد الصفوف في كل صفحة مثل 10 من الاستعلام مقارنة باستخدام ترقيم الصفحات لجدول البيانات ، فسيتم تحميل العشرة الأخرى ... مثل ترقيم الصفحات المدمج في Laravel

ملاحظة: حتى إذا تم تعطيل ترقيم الصفحات ، فلا يزال وقت التحميل 4.34 ثانية

مقتطف رمز المشكلة

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

        }
    });


  });

تفاصيل النظام

الرجاء تضمين هذه التفاصيل حول نظامك! إذا تم حذفها ، سيتم إلغاء الأولوية للتذكرة على طلبات / تذاكر المستخدمين الآخرين.
  • نظام التشغيل Ubuntu 17.10
  • PHP 7.2.2
  • Laravel 5.6
  • Laravel-Datatables 8.4
performance question

التعليق الأكثر فائدة

استخدم الاستعلام بدلاً من التجميع بإزالة get() مصدر بياناتك.

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

ال 8 كومينتر

استخدم الاستعلام بدلاً من التجميع بإزالة get() مصدر بياناتك.

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

yajra شكرا لك حل المشكلة

مرحباً ، هل يمكنك توضيح سبب كون الاستعلام أسرع بكثير من التجميع؟

لأنه يؤدي باقي الوظائف في الاستعلام بدلاً من الحصول على كل نتيجة وبياناتها الفرعية ومحاولة أداء الوظائف على تلك الأقل كفاءة.

وقت الاستجابة بطيء
تحميل الصفحة: 13.40 ثانية
ترقيم الصفحات: 9 ث
مقتطف الرمز

مراقب

إقراض الوظيفة العامة_return_log_server_side ()
{
$ alluser = Session :: get ('alluser')؛
$ reference = $ this-> database-> getReference ('lending_return_log') -> getSnapshot () -> getValue () ؛
مرجع $ = array_reverse (مرجع $) ؛
بيانات دولار = [] ؛
اسم $ = "" ؛
البريد الإلكتروني $ = "" ؛
foreach (مرجع $ كـ $ lending_return_log) {
// dd ($ lending_return_log ['uid']) ؛
foreach ($ alluser كـ $ key => $ value) {
إذا ($ key == $ lending_return_log ['uid']) {
اسم $ = قيمة دولار ['اسم المستخدم'] ؛
$ email = قيمة $ ['email'] ؛
}
}
$ nestedData ['user_info'] = " ". "
". $ email."
". lending_return_log $ ['lending_log_id'] ؛
$ nestedData ['time_and_trx_id'] = \ Carbon \ Carbon :: parse ($ lending_return_log ['time']) -> تنسيق ('F j، Y، g: i a'). "
". lending_return_log $ ['trxid']."
$ nestedData ['back_amount'] = " " .number_format ($ lending_return_log ['amount_back_nob']، 8). "NOB
$ nestedData ['close_balance'] = " " .number_format ($ lending_return_log ['final_balance_nob']، 8). "NOB
$ nestedData ['nob_price'] = $ lending_return_log ['nob_price_at']. "$"؛
$ nestedData ['urr_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;
}

شبيبة

(وظيفة() {
$ ('# table'). DataTable ({
المعالجة: صحيح ،
جانب الخادم: صحيح ،
أياكس: '{{url (' project-log-serveride ')}}'،
الأعمدة: [
{data: 'user_info' ، الاسم: 'user_info'} ،
{data: 'time_and_trx_id' ، الاسم: 'time_and_trx_id'} ،
{data: 'back_amount'، الاسم: 'back_amount'}،
{data: 'clos_balance'، name: 'clos_balance'}،
{data: 'nob_price'، الاسم: 'nob_price'}،
{data:'urr_return '، name:'urr_return'}،
]
}) ؛
}) ؛

إصدارات الحزمة
Laravel 5.7
PHP: 7.2
بيانات Laravel: 8.13.7
قاعدة البيانات: NoSql DB (Firebase)

هل يمكنك إرضاء ما هو الخطأ في هذا؟
شكر

تحقق من الفهرسة الخاصة بك

مراقب:
$ trade1 = Tradecum3 :: حيث ('CODE'، Auth :: user () -> ucc_code) -> حيث ('SCPOPT'، '! ='، 'EX') -> حدد ('UNIQUEID'، 'CODE' ، 'TRDATE' ، 'BS' ، 'SCPOPT كـ INSTTYPE' ، 'SCPCODE' ، 'SCPNAME' ، 'DUEDATE' ، 'STRIKERATE' ، 'MKTRATE' ، 'QTY' ، DB :: raw ('ABS (MKTRATE * QTY ) كـ 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);

رأي:
$ ('# recentTradeTableAll'). DataTable ({
المعالجة: صحيح ،
جانب الخادم: صحيح ،
تدمير: صحيح ،
أياكس: {
url: "{{route ('datatable.trades')}}"،
اكتب: "POST" ،
الرؤوس: {
'X-CSRF-TOKEN': $ ('meta [name = "csrf-token"]'). attr ('content')
} ،
البيانات: الوظيفة (د) {

                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 () يقوم بتحميل كافة البيانات ولا يعمل pageLength .. ما سبق يتم تحميل كافة السجلات.

استخدم الاستعلام بدلاً من التجميع بإزالة get() مصدر بياناتك.

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

هذا جعل استفساري ينتقل من 20 ثانية إلى أقل من 2. شكرًا لك!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات