Desempenho lento ao carregar 537 registros
no carregamento da página: 4,34 segundos
na paginação: 3,98 segundos
"pageLength": 10
existe alguma possibilidade de limitar linhas por página como 10 da consulta do que ao usar a paginação da tabela de dados carregará as outras 10 ... como a paginação de laravel integrada
PS: mesmo se a paginação estiver desabilitada, o tempo de carregamento ainda é de 4,34 segundos
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;
}
} );
}
});
});
Use consulta em vez de coleção removendo get()
de sua fonte de dados.
>orderBy('axe_recherche', 'asc')
->get(); // remove this line.
@yajra Obrigado problema resolvido
oi você pode explicar por que a consulta é muito mais rápida do que a coleta?
Porque ele executa o resto das funções na consulta em vez de obter todos os resultados e seus subdados e tentar executar as funções naquilo que é menos eficiente.
O tempo de resposta é lento
carregamento da página: 13.40s
paginação: 9s
Fragmento de código
função pública lending_return_log_server_side ()
{
$ alluser = Session :: get ('alluser');
$ reference = $ this-> database-> getReference ('lending_return_log') -> getSnapshot () -> getValue ();
$ referência = array_reverse ($ referência);
$ data = [];
$ name = '';
$ 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 ['username'];
$ 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']) -> formato ('F j, Y, g: i a'). "
". $ lending_return_log ['trxid']." ";
$ nestedData ['back_amount'] = " " .number_format ($ lending_return_log ['amount_back_nob'], 8). "NOB ";
$ nestedData ['balanço_de_fecho'] = " " .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;
}
(função () {
$ ('# tabela'). DataTable ({
processamento: verdadeiro,
serverSide: true,
ajax: '{{url (' project-log-serverside ')}}',
colunas: [
{data: 'user_info', nome: 'user_info'},
{data: 'time_and_trx_id', nome: 'time_and_trx_id'},
{data: 'back_amount', name: 'back_amount'},
{dados: 'balanço_de_fecho', nome: 'balanço_de_fecho'},
{data: 'nob_price', nome: 'nob_price'},
{data: 'curr_return', nome: 'curr_return'},
]
});
});
Versões de pacote
Laravel 5.7
PHP: 7.2
Laravel Datatable: 8.13.7
Banco de dados: NoSql DB (Firebase)
Você pode agradar o que há de errado nisso?
obrigado
Verifique sua indexação
Controlador:
$ 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 ) como 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);
Visualizar:
$ ('# recentTradeTableAll'). DataTable ({
processamento: verdadeiro,
serverSide: true,
destruir: verdadeiro,
ajax: {
url: "{{route ('datatable.trades')}}",
tipo: 'POST',
cabeçalhos: {
'X-CSRF-TOKEN': $ ('meta [name = "csrf-token"]'). Attr ('content')
},
dados: função (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 () carrega todos os dados e pageLength não está funcionando ... o acima está carregando todos os registros.
Use consulta em vez de coleção removendo
get()
de sua fonte de dados.>orderBy('axe_recherche', 'asc') ->get(); // remove this line.
Isso fez minha consulta passar de 20 segundos para menos de 2. Obrigado!
Comentários muito úteis
Use consulta em vez de coleção removendo
get()
de sua fonte de dados.