Laravel-datatables: Медленная производительность

Созданный на 12 мар. 2018  ·  8Комментарии  ·  Источник: yajra/laravel-datatables

Краткое изложение проблемы или запроса функции

Низкая производительность при загрузке 537 записей
при загрузке страницы: 4,34 секунды
при разбиении на страницы: 3,98 секунды

"pageLength": 10
есть ли возможность ограничить количество строк на странице, например 10 из запроса, чем при использовании разбивки на страницы datatable, он загрузит другие 10 ... как встроенная разбивка на страницы laravel

PS: даже если пагинация отключена, время загрузки все равно 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 с
Фрагмент кода

Контроллер

публичная функция lending_return_log_server_side ()
{
$ alluser = сеанс :: получить ('alluser');
$ reference = $ this-> database-> getReference ('lending_return_log') -> getSnapshot () -> getValue ();
$ ссылка = array_reverse ($ ссылка);
$ data = [];
$ name = '';
$ email = '';
foreach ($ ссылка как $ lending_return_log) {
// дд ($ lending_return_log ['uid']);
foreach ($ alluser as $ key => $ value) {
if ($ key == $ lending_return_log ['uid']) {
$ name = $ 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 ['закрывающий_баланс'] = " " .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

(функция () {
$ ('# таблица'). DataTable ({
обработка: правда,
serverSide: правда,
ajax: '{{url (' журнал-проекта-сервера ')}}',
столбцы: [
{данные: 'user_info', имя: 'user_info'},
{data: 'time_and_trx_id', name: 'time_and_trx_id'},
{данные: 'back_amount', имя: 'back_amount'},
{данные: 'закрытие_баланса', имя: 'закрытие_баланса'},
{данные: 'nob_price', имя: 'nob_price'},
{данные: 'curr_return', имя: 'curr_return'},
]
});
});

Версии пакета
Laravel 5.7
PHP: 7.2
Laravel Datatable: 8.13.7
База данных: NoSql DB (Firebase)

Подскажите, пожалуйста, что в этом плохого?
Спасибо

Проверьте свою индексацию

Контроллер:
$ 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 ) как 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);

Вид:
$ ('# latestTradeTableAll'). DataTable ({
обработка: правда,
serverSide: правда,
уничтожить: правда,
ajax: {
url: "{{route ('datatable.trades')}}",
введите: 'POST',
заголовки: {
'X-CSRF-TOKEN': $ ('meta [name = "csrf-token"]'). Attr ('content')
},
data: function (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 () загружает все данные, а pageLength не работает .. выше загружаются все записи.

Используйте запрос вместо сбора, удалив get() в источнике данных.

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

В результате мой запрос увеличился с 20 секунд до менее 2. Спасибо!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги