Afficher une seule occurrence des lignes qui ont les mêmes valeurs

europe21 Messages postés 65 Statut Membre -  
europe21 Messages postés 65 Statut Membre -
Bonjour,
Je suis sous symfony 4.
Je cherche a n'afficher qu'une seule occurence des lignes qui ont les mêmes valeurs dans ma base de donnée.
Je veux afficher les commandes en cours de mes clients. mais si un client a plusieurs commandes je ne veux pas que sont nom soit affiché 3 ou 4 fois.
J'ai pensé au GOUP BY mais je ne suis pas sur.
J'ai essayé en DQL comme cela:

public function Acommande(ObjectManager $manager)
{
$repo = $this->getDoctrine()->getRepository(Commande::class);
$commande = $repo->findAll();
$commandes= $manager->createQuery('SELECT adherentId,produitId,qte FROM App\Entity\Commande GROUP BY adherentId');

return $this->render('admin/commande/a-commandes.html.twig', [
'commande' => $commande,
'commandes' => $commandes

]);
}


Mon twig:

{% for c in commandes %}
{{c.adherentId}} </br>
{{c.produitId}} </br>
{{c.qte}}
{% endfor %}


Je n'ai pas d'erreur mais rien ne s'affiche.

J'ai fait une erreur?
Ou alors est il possible de faire cela directement dans mon fichier twig?
Merci de votre aide.

Configuration: Windows / Chrome 84.0.4147.125

8 réponses

  1. jee pee Messages postés 31893 Date d'inscription   Statut Modérateur Dernière intervention   9 984
     
    Bonjour,

    Le sql ne permet pas directement d'avoir ce que tu souhaites, remplace le group by par un order by. C'est à toi, dans la boucle d'affichage, de tester si l'id courant est le même que le précédent (que tu auras sauvegardé dans l'itération précédente) et dans ce cas ne pas l'afficher.

    1
  2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonjour,

    Si je comprends bien ce que tu veux faire, c'est afficher, pour chaque adhérent, la qte total de produit ( de chaque produit ) commandé ?
    Donc, oui, le groupe by serait la solution... surtout pour faire la somme des qte...

    SELECT adherentId
        ,produitId
       , SUM(qte) as TOTAL_QTE
    FROM App\Entity\Commande  
    GROUP BY adherentId, produitId
    


    Une fois la requête exécutée, le plus simple c'est de retravailler l'array dans le controller avant de l'envoyer à la vue.
    un truc du gerne
    $out = array();
    
    foreach($commandes as $C){
      $out[$C['adherentId']][$C['produitId']] = $C['TOTAL_QTE'];
    }
    
     return $this->render('admin/commande/a-commandes.html.twig', [ 'commandes' => $out ]);
    


    Niveau twig, ensuite, ça devrait donner un truc du style
    {% for adherentId,c in commandes %}
    {{adherentId}} </br>
      {%for prd,qte in c %}
         {{prd}}
         {{qte}}
          </br> 
       {% endfor %}
    {% endfor %}
    


    et en cas de besoin pour voir ce que te contient tes variables.. n'hésites pas à faire des dump

    1
  3. jee pee Messages postés 31893 Date d'inscription   Statut Modérateur Dernière intervention   9 984
     
    Là tu es sur un autre cas, et il faudrait voir la requête car là il est possible en sql par un group by d'avoir le total. Comme
    select commande, produit, sum(qte) from table group by commande, produit


    Et pour le traiter à la main dans la boucle, il faut accumuler les qte, et on affiche le total que quand dans la boucle on change de produit (et quand on est sorti de la boucle, afficher le dernier produit traité).
    1
  4. europe21 Messages postés 65 Statut Membre
     
    Ok merci. Mais est possible d 'aditionner directement dans ma vue un champs dans ma boucle. Par exemple j'affiche touttes les commandes faites pour un short rouge. Mais au lieu d'avoir ca :
    short rouge 1
    short rouge 1
    short rouge 3

    Je voudrai :
    short rouge 5

    donc dans ma boucle :
    {% for c in commande %}
    <tbody>
    {% if c.dateattribution == null %}

    <td class="text-center">{{c.produit.title}}</td>
    <td class="text-center">{{c.produit.code}}</td>
    <td class="text-center">{{c.produit.categoryproduit.title}}</td>
    <td class="text-center">
    <span class="">{{c.qte}}</span>

    </td>
    {% endif %}

    </tbody>
    </tr>
    {% endfor %}


    Une fois que je lui aurais dit de n'afficher qu'une seule occurrence de mon article je voudrais additionner la variable c.qte
    Mais je ne vois pas comment faire.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. europe21 Messages postés 65 Statut Membre
     
    J'ai essayé:
    mon controller:
    public function Acommande(ObjectManager $manager)
    {
    $repo = $this->getDoctrine()->getRepository(Commande::class);
    $commande = $repo->findAll();
    $commandes = $manager->createQuery('SELECT adherentId
    ,produitId
    , SUM(qte) as TOTAL_QTE
    FROM App\Entity\Commande
    GROUP BY adherentId, produitId');

    $out = array();

    foreach($commandes as $C){
    $out[$C['adherentId']][$C['produitId']] = $C['TOTAL_QTE'];

    }
    var_dump($out);

    return $this->render('admin/commande/a-commandes.html.twig', [
    'commande' => $commande,
    'commandes' => $out

    ]);
    }
    }


    mon twig:
    {% for adherentId,c in commandes %}
    {{adherentId}} </br>
    {% for produitId,qte in c %}
    {{produitId}}
    {{qte}}
    </br>
    {% endfor %}
    {% endfor %}


    J'ai remplacé prd par produitId car je ne comprenais pas d'ou le prd venait.

    Je n'ai toujours pas d'erreur mais rien ne s'affiche.
    Le var dump de $out me donne un tableau vide: array(0) { }
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Il manque le ->getResult() après ton >createQuery non ?
      Normal que $out soit vide...
      0
      1. europe21 Messages postés 65 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Je viens d'essayer avec le getResult(); et c'a me met une erreur:
        [Syntax Error] line 0, col 82: Error: Expected end of string, got 'BY'
        0
      2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > europe21 Messages postés 65 Statut Membre
         
        Montres le code que tu as écrit .... ( et cette fois... merci d'indiquer le LANGAGE dans les balises de code )

        NB: Pour utiliser les balises de code correctement... merci de lire ENTIEREMENT le lien ci-dessous :
        https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
        0
  7. europe21 Messages postés 65 Statut Membre
     
    Salut,
    Je bloque toujours.
    Je n'ai toujours pas d'erreur mais rien ne s'affiche.
    Le var dump de $out me donne un tableau vide: array(0) { }
    0
  8. europe21 Messages postés 65 Statut Membre
     
    Je suis partie sur une autre logique , je suis presque au bout mais j'ai encore un souci:
    mon controller:
     public function Acommande(ObjectManager $manager)
    {
    $repo = $this->getDoctrine()->getRepository(Commande::class);
    $commande = $repo->findAll();

    $commandes = $manager->createQuery('SELECT c, p, sum(c.qte) FROM \App\Entity\Commande c INNER JOIN \App\Entity\Produit p WHERE c.dateattribution IS NULL GROUP BY p.id ')->getScalarResult();

    return $this->render('admin/commande/a-commandes.html.twig', [
    'commande' => $commande,
    'commandes' => $commandes

    ]);

    }

    mon twig:
    {% for c in commandes %}
    {{c.p_title}} {{c.c_qte}}</br>

    {% endfor %}


    le resultat:
    Short rouge 1
    Short vert 1
    chaussure verte 1
    t shirt essai 1
    Bonnet 2 1
    pantalon bleu 1
    gggggg 1
    hhhhh 1

    Pour le regroupement des produit c'est bon par contre il ne me fait pas la sommes des quantité . Il ne me donne a chaque fois la premiere quantité de mon tableau commande .
    Et moi ce que je cherche a obtenir c'est la sommes des quantités par produit des commandes ou le champ dateattribution est NULL dans mes commandes.

    ma table commande:


    si quelqu'un peut m'aider, se serait un vrai soulagement.
    Merci beaucoup
    0
  9. europe21 Messages postés 65 Statut Membre
     
    ok désolé.
    mon controller:
    public function Acommande(ObjectManager $manager)
        {
            $repo = $this->getDoctrine()->getRepository(Commande::class);
            $commande = $repo->findAll();
    
           
           $commandes = $manager->createQuery('SELECT adherentId,produitId, SUM(qte) as TOTAL_QTE FROM App\Entity\Commande GROUP BY adherentId, produitId')->getResult();
    
    $out = array();
    
    foreach($commandes as $C){
     $out[$C['adherentId']][$C['produitId']] = $C['TOTAL_QTE'];
    
    }
    var_dump($out);
        
            return $this->render('admin/commande/a-commandes.html.twig', [
            'commande' => $commande,
               'commandes' => $out
    
            ]);
            
        }

    et mon twig:
    {% for adherentId,c in commandes %}
    {{adherentId}} </br>
      {% for produitId,qte in c %}
         {{produitId}}
         {{qte}}
          </br> 
       {% endfor %}
    {% endfor %}

    l'erreur:
    [Syntax Error] line 0, col 82: Error: Expected end of string, got 'BY'
    0