8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je viens vers vous car j'ai un soucis avec une de mes requetes, je n'arrive pas tout a fait a faire ce que je veut :s

En fait je cherche a lister des produits qui sont dans une sous-catégorie (qui appartient a une catégorie), et qui sont proposer par des vendeur

J'ai 5 entité:

une avec les produits

une avec les catégories

une avec les sous-catégorie

une avec les vendeurs

et une qui match les produits detenu par les vendeurs

L'objectif est de partir d'une catégorie et de récupéré les sous-catégorie liée, avec les produits détenu par un vendeur défini.

J'ai fait une requete qui fonctionne est me donne exactement ce que je veut :

On est dans le repository SousCat, $id correspond a l'id de la category, $vendeur correspond l'id du vendeur

public function findSouscatForCategory($id,$vendeur)
    {
     
    $qb = $this->createQueryBuilder('a')
                ->leftJoin('a.category', 'd')
                ->leftJoin('a.products', 'p')
                ->leftJoin('p.store', 's')
                ->addSelect('d')
                ->addSelect('p')
                ->addSelect('s')
                ->where('a.category = :id')
                ->setParameter('id', $id)
                ->andWhere('s.vendeur = :vendeur')
                ->setParameter('vendeur', $vendeur)
                ;
     
        return $qb->getQuery()->getResult();
         
    }




Cette requete me donne tout ce que je veut, ces a dire tous les produits pour un vendeur donner et une categorie donnée rangé par sous-categorie.

Mais le probléme que je rencontre, ces quand il n'y a pas d'article qui matche avec le vendeur... quand ces le cas sa me retourne un résultat vide, ce qui est normal... mais j'aurais voulu quand meme pouvoir lister les sous-catgorie en mettant un message comme quoi aucun produit n'a été trouver, mais vu que ma requete me renvois un tableau vide, je n'est meme pas accés au sous-catégorie :s

De la meme facon, si il n'y a pas de produit dans certaine sous-categorie d'une catégorie, les sous-catégories avec produit s'affiche bien, par contre celle qui n'ont pas de produit trouvé ne s'affiche du coup pas du tous :s

Vous aurez comprit que meme si sa marche ce n'est pas le comportement que je recherche, je voudrait que meme si un vendeur n'a aucun produit dans une sous-catégorie la catégorie s'affiche, et la j'ajouterais un message comme quoi il n'y a pas de produits.

En fait je voudrais que si le:


->andWhere('s.vendeur = :vendeur')


ne retourne aucun resultat, je puisse avoir quand meme le reste des donnée recupéré, et un tableau vide pour les produits.

Je cherche depuis un moment comment faire, mais je ne trouve rien de concluant, j'espere que vous arriverez a me mettre sur la piste, je suis sur que sa ne doit pas etre bien compliquer, mais la je n'arrive plus a y voir clair :s

J'espere que vous aurez comprit mon soucis et que vous pourrez me donner un coup de pouce Smiley smile

Merci d'avance Smiley smile
Bonjour,

Juste 2 suggestions :
- Pourquoi tu n'utilises pas la même entity pour catégorie et sous-catégorie. Il suffit qu'une catégorie possède un id parent d'une autre catégorie pour savoir que c'est une sous-catégorie.

- Pourquoi tu n'utilises pas createQuery au lieu de createQueryBuilder ? L'écriture de la requête en DQL est plus simple et plus lisible. De plus, createQueryBuilder est utile principalement si tu as besoin de générer tes requêtes. Ce qui n'a pas l'air d'être ton cas.

Pour le reste, essaye déjà de faire une requête sql qui fonctionne et met là ici.
On la convertira en dql si tu veux ou createquery si vraiment t'insistes. Smiley lol
Salut,
Merci de ta reponse Smiley smile
Pour le createQueryBuilder(), je n'ai pas encore une grande experience avec symfony et j'ai pris l'habitude de faire mes requetes comme sa, ces peut etre une erreurs.

Concernant ma requete en particulier, elle fonctionne car elle me retourne bien les resultats que je veut, ces a dire les produits ranger par sous-catégorie pour une catégorie donner et un vendeur donner.

Par contre cette requete ne fonctionne pas lorsque un vendeur n'a aucun produit dans une sous-catégorie, la requete me retourne un tableau vide, ce qui est normal, mais j'aurais quand meme voulu avoir la liste des sous-categorie pour la categorie, et la je n'est pas reussi a le faire.

Du coup j'ai essayer une autre approche, mais sa me semble tellement tordu que sa ne doit pas etre terrible, par contre j'obtien ce que je veut...

J'utilise la methode suivante pour recuperer les sous-categorie et a partr de la recuperer les produits avec la methode listAction()

$sousCat= $this->getDoctrine()
->getRepository('AppBundle:SousCat')
->findByCategory($id);
$test = Array();
foreach($sousCat as $cat)   {
$product = $this->listAction($cat->getId(),$vendeur);
$new = Array('product' => $product,'sousCat' => $cat);
array_push($test, $new);
}


et la methode listAction()

public function listAction($id) {

        $qb1 = $this->createQueryBuilder('p')
                ->leftJoin('p.sousCat', 'a')
                ->leftJoin('p.vendeur', 'v')   
                ->addSelect('a')
                ->addSelect('v')
                ->where('a.id = :souscat')   
                ->andWhere('v.vendeur = :vendeur')
                ->setParameter('souscat',$id)
                ->setParameter('vendeur',$vendeur)
                ;
            $rep1 = $qb1->getQuery()->getResult();
        return $rep1;
    }


donc du coup, la je recupere les sous-categories, a partir de la je recupere les produit liée a cette catégorie et a un vendeur donner, du coup je regroupe ces 2 résultat dans un tableau que j'envoie ensuite a ma vue, alors sa fonctionne, mais je pense qu'il y a surement un autre moyen de faire :s

Vous avez des suggestions?
Et par ailleurs une question complementaire, mon principe et de rechercher les produits pour une sous-categorie et un vendeur donner, y a t'il des limitations si on a enrmement de produit ou de vendeur?
Par exemple est ce que sa fonctionnera correctement si on a des millions de produits et des milliers de vendeur?

Merci de toutes l'aide que vous pourrez m'apporter Smiley smile
En partant du principe que tu n'as qu'une table category avec un parent_id, j'aurais fait un truc comme ça :
public function getProductsBySellerAndCategory($seller_id, $category_id) {
  return $this->getEntityManager()->createQuery(
    'SELECT cat, prod
    FROM AppBundle:Category cat
    LEFT JOIN AppBundle [langue]roduct prod WITH prod.category = cat.id
    INNER JOIN AppBundle:Seller sell WITH prod.seller = sell.id
    WHERE sell.id = :seller_id
    AND cat.id = :category_id
    AND cat.parent_id = cat.id'
    )->setParameters(['seller_id' => $seller_id, 'category_id' => $category_id])
     ->getResult();
}

Tu dois en théorie trouver toutes tes catégories, et les produits lorsqu'il y en a. Mais bon le SQL n'est pas mon fort, donc je te garantie rien. Smiley langue

Au fait je t'ai mis tous les noms de table en anglais parce que je ne sais pas exactement quelle est ta méthode mais il y a un coup de l'anglais, du français, du singulier, du pluriel. Il faut que tu homogénéises tout ça.
Modifié par Raphi (13 Sep 2015 - 16:48)
rif5 a écrit :
Pour le createQueryBuilder(), je n'ai pas encore une grande experience avec symfony et j'ai pris l'habitude de faire mes requetes comme sa, ces peut etre une erreurs.

La documentation Doctrine dit ceci (1er paragraphe) :
a écrit :
A QueryBuilder provides an API that is designed for conditionally constructing a DQL query in several steps.

C'est très adapté pour construire des requêtes SQL à la volée, mais pas la meilleure solution pour effectuer une requête de ce type. En terme de performance, ça rajoute une couche de traitement et même si l'impact est probablement minime autant écrire directement du DQL au lieu de le générer avec queryBuilder. D'ailleurs la documentation Symfony2 met d'abord en avant la notation DQL.

rif5 a écrit :
Et par ailleurs une question complementaire, mon principe et de rechercher les produits pour une sous-categorie et un vendeur donner, y a t'il des limitations si on a enrmement de produit ou de vendeur?
Par exemple est ce que sa fonctionnera correctement si on a des millions de produits et des milliers de vendeur?

Y a pas de raisons, ça reste une requête relativement simple à mon avis. Mais si un jour tu as des millions d'enregistrement il faudra sûrement changer d'hébergement, voir peut-être de BDD (PostgreSQL par exemple).
Merci pour ton exemple, et les explications Smiley cligne

J'ai essayer ton code, et finalement je rencontre le meme probléme, c'est a dire que si il n'y a pas de produit pour la catégorie et le vendeur donnée, je récupere un tableau vide :s

Par contre avec ton exemple, au lieu d'un tableau j'envoie 3 tableau a twig, et la je n'ai pas comprit comment récuperer facilement le contenu, la structure du tableau récupérer par twig est celle-ci (de mon controller j'envoie le tableau "Products":


[Products]
        [0][ category ]     //-> 1ére catégorie
        [1][ product ]       //->les produits de la 1ére catégorie
        [2][ product ]
        [3][ product ]
        [4][ category ]    //-> 2éme categorie
        [5][ product ]     //->les produits de la 2éme catégorie
        [6][ product ]
            ...
   //et ainsi de suite


Et la je ne voie pas comment boucler dans twig pour afficher les produits par catégorie, pourrais tu m'éclairer sur ce qui ma échapper?

Merci de ton aide, et si d'autre on un avis n'hésitez pas Smiley smile
Modifié par rif5 (17 Sep 2015 - 18:10)