Tri foreach par nombre de points

Ce sujet est résolu
Default
,

Bonjour à tous.
Je viens vous voir parce que j'ai une question qui me bloque et j'aimerais quelques indications.

Pour un site, j'affiche des liens cliquables par les utilisateurs, ces liens rapportent un certain nombre de points et son stockés en bdd.
Le soucis, c'est que j'aimerais pouvoir afficher ces liens par leur nombre de points, du genre "1 pts => liens 1;3;7;22", "2 pts => liens 2,4..."

Bref, vous m'avez compris. Le truc est que je n'arrive pas à exécuter ce genre de tri, j'ai essayé le groupBy mais je me retrouve aussi avec des erreurs.

Pour l'instant, je procède comme ça, je récupère les points & liens avec ma requête SQL :

$liens_distinct = Liens::whereNotIn('id', function($query) {
            $user = Auth::user();
            $query->select('liens_id')
                ->from('liens_user')
                ->where('user_id', '=', $user->id);
        })->select('liens', 'points')->orderBy('points')->get();

Et je l'affiche de cette manière :

@foreach($liens_distinct as $ld)
                <div class="col-md-3 titre-liens">
                    <h2 class="grs cnt pts">{{ $ld->points }} Point</h2>
                </div>
                <div class="col-md-9">
                    <div class="row">
                        <div class="col-md-4">
                            <a href="{{ route("postLiens", $ld) }}">{{ $ld->points }}</a>
                        </div>
                    </div>
                </div>
            @endforeach

Du coup, ça affiche tous les points et ça affiche aussi le liens associé. En soit ça va, mais ça serait nettement plus pratique d'afficher les liens en fonction du nombre de points qu'ils rapportent.

Du coup, si vous avez une indication pour effectuer ce tri, je suis preneur, merci !

7 Réponse

Default
,

Bonjour,

En fouillant la doc, j'ai trouvé qu'on pouvait utiliser le groupBy sur une collection qui faisait exactement ce que je cherchais;

En terme de code je me retrouve à faire ça :

$liens_distinct = Liens::whereNotIn('id', function($query) {
            $user = Auth::user();
            $query->select('liens_id')
                ->from('liens_user')
                ->where('user_id', '=', $user->id);
        })->get();

        $liens_group = $liens_distinct->groupBy('points');
        $liens_array = $liens_group->toArray();

Et j'affiche le tout comme ça :

<div class="row liens">
            @foreach($liens_array as $la => $val)
                <div class="col-md-3 titre-liens">
                    <h2 class="grs cnt pts">{{ $la }} Point</h2>
                </div>
                <div class="col-md-9">
                    <div class="row">
                        @foreach($val as $l => $value)
                        <div class="col-md-4">
                            <a href="{{ route("postLiens", $value['id']) }}">{{ $value['liens'] }}</a>
                        </div>
                        @endforeach
                    </div>
                </div>
            @endforeach
            </div>

Et c'est ok :)
Merci !

40917
, Il a répondu à ma question !

Bonsoir,

Une petite recherche google m'a dit qu'il suffit de défénir l'odre du "orderby" pour avoir ce que tu cherches

->orderBy('points ASC')
// ou
->orderBy('points DESC')
//
->orderBy('points', 'ASC')
// ou
->orderBy('points', 'DESC')

Je connais absolument pas Laravel.

Default
, Il a répondu à ma question !

Bonsoir.

J'ai du mal m'expliquer concernant ce que je souhaitais. Sans toucher à ma requête (qui exécute correctement un order by), j'obtiens ce résultat sur ma page :

https://image.noelshack.com/fichiers/2017/49/3/1512594086-capture.jpg

Ce que je cherche contrairement à l'image, c'est juste afficher une seule fois le nombre de points, et à côté, tous les liens qui donnent ce nombre de points.

40917
, Il a répondu à ma question !

Au temps pour moi, j'avais mal compris la demande

Default
, Il a répondu à ma question !

Pas de problèmes, au moins j'ai été plus clair pour les autres

48587
, Il a répondu à ma question !

J'avoue que la question n'est pas très claire.

Au final, ton soucis ne vient pas de la requete du tout ? Elle renvoit ce que tu souhaites (si oui, tu serais nous faire un petit echo '<pre>';print_r($resultat);exit; (ou tout autre moyen de debug visuel que tu aurais, ne connaissant pas Laravel)).

Du peu que je comprends, si tu souhaites réunir les liens par rapport au nombre de points, et donc que ton soucis ne vient que de l'affichage.
Il faudrait que tu déclares une variable contenant le nombre de points en cours. Et dans la boucle, tu compares cette variable avec la valeur du nombre de points de l'item. Dès lors que la variable déclaré et le nombre de point de l'item est différent, tu affiches "X Points" et tu changes la valeur de ta variable.

De cette manière, tu auras

(item1 avec 1 point) 1 point > lien1
(item2 avec 1 point) lien2
(item3 avec 1 point) lien3
(item4 avec 2 point) 2 point > lien4 (je change ici la variable externe à la boucle)
(item5 avec 2 point) lien5
etc.

35474
, Il a répondu à ma question !

tu peux regarder les collections laravel pour faire se genre de traitement. tu as le keyBy qui peut t'interesser. La rqt te renvoie uhne collection.

doc Laravel