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

Fermé
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 - 16 août 2020 à 10:48
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 - 24 août 2020 à 14:23
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

jee pee Messages postés 39816 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 2 juin 2024 9 212
Modifié le 16 août 2020 à 11:28
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
jordane45 Messages postés 38197 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 30 mai 2024 4 675
16 août 2020 à 12:00
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
jee pee Messages postés 39816 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 2 juin 2024 9 212
16 août 2020 à 12:01
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
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
Modifié le 16 août 2020 à 11:47
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
Modifié le 16 août 2020 à 13:08
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
jordane45 Messages postés 38197 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 30 mai 2024 4 675
24 août 2020 à 13:09
Il manque le ->getResult() après ton >createQuery non ?
Normal que $out soit vide...
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 > jordane45 Messages postés 38197 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 30 mai 2024
24 août 2020 à 13:35
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
jordane45 Messages postés 38197 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 30 mai 2024 4 675 > europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
24 août 2020 à 13:45
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
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
19 août 2020 à 07:43
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
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
23 août 2020 à 18:43
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
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
Modifié le 24 août 2020 à 14:26
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