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.
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') !!}'
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.
Commentaire le plus utile
Vous devez supprimer get pour utiliser le générateur de requêtes.