Laravel-datatables: Le chargement des données est très lent pour un grand nombre de lignes.

Créé le 8 mars 2017  ·  14Commentaires  ·  Source: yajra/laravel-datatables

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


J'ai essayé d'implémenter Datatable avec Laravel mais j'ai un problème lorsque ma table a un grand nombre de lignes car Datatable obtient TOUT en une seule requête, puis la pagination est du côté JS. Puis-je utiliser la pagination Laravel ou puis-je renvoyer des lignes paginées avec la méthode paginate() d'Eloquent sur la méthode ajax ? Parce que c'est un gros problème pour mon projet. Le chargement des données est très lent. Lorsque je recherche, le traitement de texte est également très lent et après certaines opérations telles que sort , search etc. La page se fige et rien ne se passe.
J'espère que quelqu'un a le même problème comme celui-ci.

Extrait de code du problème

                serverSide: true,
                processing: true,
                render: true,
                columns: [
                    {data: 'code'},
                    {data: 'name', "defaultContent": "<i>Not set</i>"},
                    {data: 'native_name',  "defaultContent": "<i>Not set</i>"},
                    {data: 'action'}
                ],
                ajax: '{!! route('dt-languages') !!}'

Détails du système

  • Système d'exploitation Linux
  • Version PHP 7.0.4
  • Version 5.4 de Laravel
  • Laravel-Datatables Version 7.2

Commentaire le plus utile

Vous devez supprimer get pour utiliser le générateur de requêtes.

return $this->languages->select('languages.*');

Tous les 14 commentaires

Vous utilisez peut-être la collection au lieu de la requête ? Pouvez-vous coller votre code côté serveur ? Merci!

J'utilise le modèle de référentiel et dans mon LanguageRepository.php j'ai:
return $this->languages->select('languages.*')->get();

Vous devez supprimer get pour utiliser le générateur de requêtes.

return $this->languages->select('languages.*');

Bien. Maintenant ça a l'air mieux. Je vais le tester à nouveau et j'écrirai mes résultats.
Mais en attendant, un autre problème est là. Lorsque j'essaie de rechercher un mot, j'obtiens cette erreur :

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'languages.action' in 'where clause' (SQL: select count(*) as aggregate from (select '1' as `row_count` from `languages` where (LOWER(`languages`.`name`) LIKE %m% count_row_table)

Définissez l'action comme non consultable/commandable puisqu'il s'agit d'une colonne ajoutée.

Merci beaucoup! @yajra
Quand j'aurai fini les tests, je vous enverrai les résultats

Mes résultats de test :

Première requête :
select count(*) as aggregate from (select '1' as row_count from languages where languages.deleted_at is null and languages.deleted_at is null) count_row_table -> 3.64ms

Deuxième requête :
select languages.* from languages where languages.deleted_at is null order by code asc limit 10 offset 0 -> 1.05ms

Merci @yajra encore une fois pour son aide.

Content d'avoir pu aider ! Merci!

Je souffre du problème. Rendu lent. Ma requête côté serveur.

 $products = DB::connection("mysql2")->table('products')->
        join('products_description', 'products.products_id', '=', 'products_description.products_id')
            ->select(['products.products_id', 'products_description.products_name', 'products.products_isbn13', 'products.products_distributor', 'products.products_price', 'products.products_status']);
 return Datatables::of($products)->make(true);

aide-moi. Dois-je écrire mon propre script pour paginer ? que devrais-je faire?
J'ai des enregistrements de plus de 4 000 000 de produits.
@yajra très reconnaissant si vous m'aidez.

J'ai aussi celui-ci, peut-être que la requête datatable ne chaîne pas le paramètre de pagination à la requête?

@pnghai comment je peux le vérifier?

@hsali je suis désolé. Fausse alarme. Il s'est avéré que ma logique impliquait une récupération d'image à distance, qui se connecte à un serveur sans issue et force chaque enregistrement à récupérer une mauvaise connexion 404, qui prend le nombre d'enregistrements * 60 (secondes avant le délai d'attente). J'ai suspendu cette logique et les choses fonctionnent très bien maintenant.

Merci beaucoup
(p/s : le pseudo pnghai est un autre compte github de moi-même)

@pnghai comment je peux le vérifier?

Avez-vous pu résoudre cela ? Si oui, comment ?

Pour toute personne dont le chargement est lent, vous pouvez avoir une sorte de boucle dans la fonction de votre contrôleur qui boucle les enregistrements récupérés d'une manière ou d'une autre.

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

Questions connexes

sangnguyenplus picture sangnguyenplus  ·  3Commentaires

FilipeBorges1993 picture FilipeBorges1993  ·  3Commentaires

jgatringer picture jgatringer  ·  3Commentaires

ghost picture ghost  ·  3Commentaires

hohuuhau picture hohuuhau  ·  3Commentaires