Solution à l'échec du tri de Laravel : 1. Interrogez les données via "$query->whereIn(...)" ; 2. Filtrez les données via le filtre ; 3. Définissez les données triées sur "$data = $scoutModelsLists;".
L'environnement d'exploitation de cet article : système Windows 7, Laravel version 5.8, ordinateur Dell G3.
Comment résoudre le problème d'échec du tri de Laravel ?
Laravel 5.8+scout7.0 utilisant la solution d'échec de tri orderBy
Récemment, lors de l'utilisation d'elasticSearch6.2.4 pour effectuer des recherches, j'ai trouvé que le champ de tri n'est pas valide, je vais donc l'enregistrer ici
Jetons un coup d'œil à la solution d'abord, pas grand chose à dire Dites, allez directement au code
$list = Article::search($words)->orderBy('created_at','desc')->paginateRaw(10)->toArray(); $results = $list['data']; if ($results['hits']['total'] === 0) { return $this->model->newCollection(); } $builder =new Builder(new static(),$this->model->newModelQuery()); $keys = collect($results['hits']['hits'])->pluck('_id')->values()->all(); $query = $this->newQuery(); if ($builder->queryCallback) { call_user_func($builder->queryCallback, $query); } //查询数据 $scoutModelsLists = $query->whereIn( $this->model->qualifyColumn($this->model->getKeyName()), $keys )->orderBy('created_at','desc')->get(); //过滤数据 $scoutModelsLists->filter(function () use ($keys) { return in_array($this->model->getKey(), $keys); }); //这里为最终排序好的数据 $data = $scoutModelsLists;
Analyse du problème
L'instruction de requête originale utilisée est
$list = Article::search($words)->orderBy('created_at','desc')->paginate(10)->toArray();
Bien que l'instruction de requête ci-dessus définisse le champ de tri, elle n'est pas triée dans la finale sortie. Après analyse, il se retrouve bien dans les résultats de recherche ES. Il est trié, mais dans la sortie finale, lorsque la structure de données ES est convertie en collection, le champ de tri n'est pas ajouté
Analyse du code
Fichier. 1 : /vendor/laravel/scout/src/builder.php Environ 261 lignes - Ligne 305
Regardez attentivement ce fichier. Il existe deux méthodes paginate et paginateRaw La première renvoie la collection laravel et la seconde renvoie la requête native. structure de es. La différence entre les deux codes est la suivante
$results = $this->model->newCollection($engine->map( $this, $rawResults = $engine->paginate($this, $perPage, $page), $this->model )->all());
File 2 :vendor/tamayo/laravel-scout-elastic/src/ElasticsearchEngine.php Ligne 211, méthode map, car nous utilisons ici le moteur ES, si vous utilisez un autre code, cela peut être différent :
public function map(Builder $builder, $results, $model) { //无数据返回空集合 if ($results['hits']['total'] === 0) { return $model->newCollection(); } //获取所有键为_id的ES数据 //$keys = collect($results['hits']['hits'])->pluck('_id')->values()->all(); //转化ES数据并过滤 return $model->getScoutModelsByIds( $builder, $keys )->filter(function ($model) use ($keys) { return in_array($model->getScoutKey(), $keys); }); }
Du point de vue du code, s'il y a des données trouvées dans la recherche, elles seront converties et filtrées pour renvoyer un ensemble qui remplit les conditions. Si elles ne sont pas satisfaites, un ensemble vide sera renvoyé directement
Fichier 3 : /vendor/laravel/scout/src/Searchable.php Environ 171 lignes de la méthode getScoutModelsByIds, code
public function getScoutModelsByIds(Builder $builder, array $ids) { //加入软删除 $query = static::usesSoftDelete() ? $this->withTrashed() : $this->newQuery(); if ($builder->queryCallback) { call_user_func($builder->queryCallback, $query); } // 重点这里,自改代码 // return $query->whereIn( // $this->getScoutKeyName(), $ids // )->orderBy('orderBy','desc')->get(); //官方代码 return $query->whereIn( $this->getScoutKeyName(), $ids )->get(); }
Ce fichier est le point clé La raison principale est que le tri orderBy. Le champ n'a pas été ajouté lors du retour final. Par conséquent, bien que es ait été trié dans la sortie finale, il a été réinitialisé à nouveau. Afin d'empêcher d'autres endroits de pouvoir se mettre à jour après la modification du composant, les données sont renvoyées au niveau du champ. fin. Le traitement de tri a été ajouté, veuillez vous référer au début de l'article pour le plan.
C'est terminé pour le moment, et sera amélioré lorsqu'il sera vide.
Les cinq derniers didacticiels vidéo Laravel
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

La sélection de Laravel ou Python dépend des exigences du projet: 1) Si vous devez développer rapidement des applications Web et utiliser des systèmes ORM et d'authentification, choisissez Laravel; 2) Si cela implique l'analyse des données, l'apprentissage automatique ou l'informatique scientifique, choisissez Python.

Laravel convient rapidement à la création d'applications Web, et Python convient aux projets qui nécessitent une flexibilité et une polyvalence. 1) Laravel fournit des fonctionnalités riches telles que ORM et le routage, adaptées à l'écosystème PHP. 2) Python est connu pour sa syntaxe concise et un puissant écosystème de bibliothèque, et convient à des domaines tels que le développement Web et la science des données.

Utilisez Laravel et PHP pour créer des sites Web dynamiques efficacement et amusants. 1) Laravel suit l'architecture MVC, et le moteur du modèle de lame simplifie l'écriture HTML. 2) Le système de routage et le mécanisme de traitement des demandes facilitent la définition de l'URL et le traitement des entrées utilisateur. 3) Eloquentorm simplifie les opérations de base de données. 4) L'utilisation de la migration de la base de données, des opérations CRUD et des modèles de lame est démontrée par l'exemple du système de blog. 5) Laravel offre de puissantes fonctions d'authentification et d'autorisation des utilisateurs. 6) Les compétences de débogage comprennent l'utilisation de systèmes de journalisation et d'outils artisanaux. 7) Les suggestions d'optimisation des performances comprennent le chargement paresseux et la mise en cache.

Laravel réalise le développement complet à travers le moteur du modèle de lame, l'éloquente, les outils artisanaux et Laravelmix: 1. La lame simplifie le développement frontal; 2. Eloquent simplifie les opérations de base de données; 3. Artisan améliore l'efficacité du développement; 4. Laravelmix gère les ressources frontales.

Laravel est un cadre moderne basé sur PHP qui suit le modèle d'architecture MVC, fournit des outils et des fonctions riches et simplifie le processus de développement Web. 1) Il contient Eloquentorm pour l'interaction de la base de données, 2) Interface de ligne de commande artisanale pour la génération rapide de code, 3) le moteur de modèle de lame pour le développement efficace de la vue, 4) Système de routage puissant pour définir la structure de l'URL, 5) Système d'authentification pour la gestion des utilisateurs, 6) Écoute des événements et plus efficaces pour des fonctions en temps réel, 7) Cache et des systèmes de file d'attente pour l'optimisation des performances, ce qui facilite et plus efficace des fonctions en temps réel et maintiennent des applications Web modernes.

Laravel convient rapidement à la création d'applications Web, tandis que Python convient à une gamme plus large de scénarios d'application. 1.Laravel fournit des outils éloquents, moteur de modèle de lame et artisanaux pour simplifier le développement Web. 2. Python est connu pour ses types dynamiques, sa riche bibliothèque standard et son écosystème tiers, et convient au développement Web, à la science des données et à d'autres domaines.

Laravel et Python ont chacun leurs propres avantages: Laravel convient rapidement à la création d'applications Web riches en fonctionnalités, et Python fonctionne bien dans les domaines de la science des données et de la programmation générale. 1.Laravel fournit des moteurs éloquents et modèles de lame, adaptés à la création d'applications Web modernes. 2. Python a une bibliothèque standard riche et une bibliothèque tierce, et les cadres Django et Flask répondent à différents besoins de développement.

Laravel mérite d'être choisi car il peut rendre la structure du code claire et le processus de développement plus artistique. 1) Laravel est basé sur PHP, suit l'architecture MVC et simplifie le développement Web. 2) Ses fonctions de base telles que l'éloquente, les outils artisanaux et les modèles de lame améliorent l'élégance et la robustesse du développement. 3) Grâce au routage, aux contrôleurs, aux modèles et aux vues, les développeurs peuvent créer efficacement des applications. 4) Les fonctions avancées telles que la surveillance des files d'attente et des événements améliorent encore les performances de l'application.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Listes Sec
SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.

Dreamweaver CS6
Outils de développement Web visuel

ZendStudio 13.5.1 Mac
Puissant environnement de développement intégré PHP