Laravel Eloquent trie par date et enregistre également les entrées par index classé
P粉002023326
2023-08-30 14:46:23
<p>Je construis un projet en utilisant Laravel et j'ai un tableau avec tous mes produits. Sur ce tableau, les produits sont ajoutés quotidiennement et j'affiche tous les produits de la page triés par <code>created_at</code>. Cela peut être facilement fait en utilisant Laravel Eloquent et <code>->orderBy('created_at', 'DESC')</code>. </p>
<p>Cependant, j'aimerais pouvoir "épingler"/"épingler" certains produits à un certain emplacement. Pour ce faire, j'ai créé la colonne <code>rank_index</code>, qui contient le numéro que le produit doit avoir dans la collection de requêtes renvoyée. </p>
<p>Voici ma table actuelle : </p>
<pre class="brush:php;toolbar:false;">titre Rank_index créé_at
Un produit génial 2023-01-01 10:04:00
Un autre produit 4 2023-01-01 10:00:00
Voiture bébé 2023-01-01 10:05:00
Tapis vert 2 2023-01-01 10:08:00
Jouet 2023-01-01 10:07:00</pre>
<p>Le tableau suivant montre la collection que je souhaite que la requête renvoie : </p>
<pre class="brush:php;toolbar:false;">titre Rank_index créé_at
Jouet 2023-01-01 10:07:00
Tapis vert 2 2023-01-01 10:08:00
Voiture bébé 2023-01-01 10:05:00
Un autre produit 4 2023-01-01 10:00:00
Un produit génial 2023-01-01 10:04:00</pre>
<p>J'espère qu'il existe une solution pour renvoyer une telle table directement depuis la base de données. De cette façon, je n'ai pas besoin de diviser et de découper la collection, ce qui rend la demande beaucoup plus lente ! Sinon, je dois utiliser les fonctions PHP pour réorganiser, diviser et découper la collection. </p>
<p>Je serais ravi de recevoir de l'aide ! </p>
<p>Cordialement</p>
Je choisirai presque certainement la solution argent
Votre déclaration :
Cela n'a aucun sens. Il est peu probable que le fractionnement/découpage/assemblage des deux ensembles de résultats ait un impact mesurable sur les performances. Cela ne ralentira certainement pas les "demandes" !
Il s'agit d'une solution SQL adaptée à votre scénario, mais elle sera presque certainement plus lente que l'assemblage de deux ensembles de résultats, en fonction de la taille des tables impliquées.
Si vous possédez plus de 1000 jouets, le cte de récursion atteindra la valeur par défaut cte_max_recursion_degree, comme expliqué ici.
Vous pouvez supprimer la limite en exécutant la commande suivante avant la requête ci-dessus :
ou changez le CTE récursif en CTE non récursif avec "nofollow noreferrer">ROW_NUMBER() sur la table toys :
C'est un dbfiddle avec lequel vous pouvez jouer.
Je l'ai rencontré cette année. Le tri directement dans la requête est plus compliqué. Vous pouvez vous référer à cette question Le jeu de résultats MySQL est trié par position fixeSi vous souhaitez comprendre sa complexité en profondeur.
Ce que je faisais auparavant était relativement simple et était complété par deux requêtes,
Voici un exemple auquel vous pouvez vous référer