Partage
  • Partager sur Facebook
  • Partager sur Twitter

Laravel méthode chunk()

Affichage dans un tableau

Sujet résolu
    21 janvier 2020 à 17:17:40

    Bonjour

    Comment faut-il faire ?

    Je souhaiterais afficher dans 5 colonnes d'un tableau une collection de noms que j'ai préalablement divisée en cinq parties.

    Mon controller : 

    public function choix()
        {
            $nbadherents = DB::table('membres')->count();
            $package  = ceil($nbadherents/5);
             $membres = DB::table('membres')
                        ->select('ncsa', 'nom', 'prenom', 'email')
                        ->whereNotNull('email')
                        ->orderBy('nom', 'asc')
                        ->get();
              $liste = $membres->chunk($package);
              $liste->toArray();
              return view('Anim.Courriels.choixRecipient', compact('liste'));  
        }
    

    De la collection d'origine j'obtiens un array de 5 nouvelles collections contenant chacune un array contenant les données de ma table

    Voici ma table :

    <tbody>
    @foreach ($liste[0] as $value)	
    	<tr>
    		<td bgcolor="#CACACA">
    			{{$value->nom}} {{$value->prenom}}
    		</td>
    		<td bgcolor="#CACACA">
    			{{$value->nom}} {{$value->prenom}}
    		</td>
    		<td bgcolor="#CACACA">
    			{{$value->nom}} {{$value->prenom}}
    		</td>
    		<td bgcolor="#CACACA">
    			 {{$value->nom}} {{$value->prenom}}
    		</td>
    		<td bgcolor="#CACACA">
    			{{$value->nom}} {{$value->prenom}}
    		</td>
    	</tr>
    @endforeach		
    </tbody>
    

    Avec le code ci-dessus j'ai  les mêmes informations dans toutes les colonnes. C'est le mieux que j'ai pu obtenir

    Merci d'avance pour votre aide

    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2020 à 21:55:25

      Hello José,

      La fonction chunk va découper ta collection en plusieurs collection défini par la valeur du premier paramètre de la fonction. Si tu as compris du premier coup t'es trop fort. Je m'explique avec un exemple.

      Prenons un tableau pour représenter la collection. Si tu as cela comme structure :

      $collection = collect([ 
          ['nom' => 'Nom1', 'prenom' => 'Prenom1'],
          ['nom' => 'Nom2', 'prenom' => 'Prenom2'],
          ['nom' => 'Nom3', 'prenom' => 'Prenom3'],
          ['nom' => 'Nom4', 'prenom' => 'Prenom4'],
          ['nom' => 'Nom5', 'prenom' => 'Prenom5']
      ]);

      Si tu fais un :

      $listes = $collection->chunk(2);

      Tu vas obtenir une liste contenant 3 listes comme illustré ci-dessous. Pour en savoir plus, va voir la doc ici : https://laravel.com/docs/5.8/collections#method-chunk

      $listes = [ 
          [
              ['nom' => 'Nom1', 'prenom' => 'Prenom1'],
              ['nom' => 'Nom2', 'prenom' => 'Prenom2']
          ],
          [
              ['nom' => 'Nom3', 'prenom' => 'Prenom3'],
              ['nom' => 'Nom4', 'prenom' => 'Prenom4'] 
          ],
          [
              ['nom' => 'Nom5', 'prenom' => 'Prenom5']
          ]
      ];

      Donc, tu dois effectué deux boucles pour obtenir le résultat souhaité.

      <tbody>
      <!-- première boucle qui liste toutes les collections -->
      @foreach ($listes as $values) 
          <tr>
      
             <!-- deuxième boucle qui liste toutes les valeurs de la collection -->
              @foreach ($values as $value) 
                  <td bgcolor="#CACACA">
                     {{$value->nom}} {{$value->prenom}}
                  </td>
              @endforeach
          </tr>
      @endforeach    
      </tbody>

      Encore une chose,

      La ligne suivante ne sert à rien.

      $liste->toArray();

      La fonction toArray ne modifie pas l'objet courant mais retourne le résultat du model sous forme d'un tableau. Il aurait fallut écrire :

      $liste = $liste->toArray();

      Bon code !

      Daniel



      -
      Edité par DanielThalmann 22 janvier 2020 à 20:54:26

      • Partager sur Facebook
      • Partager sur Twitter
        22 janvier 2020 à 9:10:54

        Merci Daniel pour ton aide.

        La seule chose qui me gêne encore est que j'obtiens un résultat en ligne alors que je souhaiterais l'avoir en colonne. C'est à dire une sous collection par colonne ....

        • Partager sur Facebook
        • Partager sur Twitter
          22 janvier 2020 à 21:17:31

          Si je reprend ton code, tu as calculé le nombre maximum de ligne que tu obtiendras avec 5 colonnes.

          Donc, tu peux procéder de la manière suivante :

          $nbrows = ceil($nbadherents/5);
          
          

          Dans ta vue, tu ajoutes la variable $nbrows puis tu utilises ce code :

          <!-- effectue une boucle sur le nombre de ligne pour produire les tr -->
          @for($row = 0; $row < $nbrows ; $row++)
              <tr>
           
                 <!-- effecue la boucle sur la collection de base qui contient les 5 listes -->
                  @foreach ($listes as $values)
                      <td bgcolor="#CACACA">
                          <!-- uniquement si la ligne de la collection exite, affiche les valeurs -->
                          @if(isset($values[$row]))
                              {{$values[$row]->nom}} {{$values[$row]->prenom}}
                          @endif
                      </td>
                  @endforeach
          
              </tr>
          @endfor







          • Partager sur Facebook
          • Partager sur Twitter
            25 janvier 2020 à 22:34:31

            Encore une aide efficace

            Merci Daniel

            • Partager sur Facebook
            • Partager sur Twitter

            Laravel méthode chunk()

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown