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

europe21 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   -  
europe21 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   -
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 41562 Date d'inscription   Statut Modérateur Dernière intervention   9 729
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 753
 
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 41562 Date d'inscription   Statut Modérateur Dernière intervention   9 729
 
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 62 Date d'inscription   Statut Membre Dernière intervention  
 
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 62 Date d'inscription   Statut Membre Dernière intervention  
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 753
 
Il manque le ->getResult() après ton >createQuery non ?
Normal que $out soit vide...
0
europe21 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   > jordane45 Messages postés 38486 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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 753 > europe21 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention  
 
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 62 Date d'inscription   Statut Membre Dernière intervention  
 
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 62 Date d'inscription   Statut Membre Dernière intervention  
 
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 62 Date d'inscription   Statut Membre Dernière intervention  
 
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