8722 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Après avoir lu de nombreux topics (sur ce site et sur bien d'autres encore) et la documentation de doctrine, je n'ai pas trouvé réponse à une question toute simple :

Est-il possible de limiter la taille des collections appartenant à un objet avec doctrine ?

Je m'explique :

Si j'ai des catégories et que dans chaque catégorie j'ai 5000 produits. Je vais faire la requête suivante (avec le query builder) pour lister les catégories et les produits associés pour chacune d'elles.

$qb = $this->createQueryBuilder('c');
$qb->where($qb->expr()->in('c.id', $arrayId));
$qb->leftJoin('c.produitCollection', 'p')
                ->addSelect('p');
$qb->orderBy('c.nom', 'ASC');
$query = $qb->getQuery();


Mais en fait, je ne souhaite charger que les 3 premiers produits de chaque catégorie de façon à avoir un résultat de ce type :

- catégorie 1
--produit A
-- produit B
--produit C

- catégorie 2
--produit A
-- produit B
--produit C

etc

J'ai donc voulu utiliser la classe paginator comme ceci :


$qb = $this->createQueryBuilder('c');
$qb->where($qb->expr()->in('c.id', $arrayId));
$qb->leftJoin('c.produitCollection', 'p')
                ->addSelect('p');
$qb->orderBy('c.nom', 'ASC');
$query = $qb->getQuery();
 
$query->setFirstResult(0)
      ->setMaxResults(3);
 
return new Paginator($query, true);

Malheureusement, j'obtiens les 3 premières catégories avec l'intégralité de leur collection de produits associés.

J'ai regardé du côté du chargement des collections avec EAGER par exemple, mais cela porte seulement sur le moment de chargement d'une collection et non sur sa taille (en fait, cela signifie si j'ai bien compris "fait la jointure si on accède à la collection"). La collection est donc totalement chargée.

De plus s'il est possible de limiter la taille d'une collection associée à l'objet chargé, est-il possible de spécifier une taille différente pour chaque collection chargée ?

Par exemple, je reprends mes catégories qui comprennent des collections de produits qui eux mêmes peuvent comprendre une collection d'images.

Donc est-il possible d'obtenir que pour toutes les catégories, je charge 5 produits et que pour chaque produit, je charge 2 images ?

Je précise que je développe sous Symfony et que l'entité Catégorie contient la déclaration de collection de produits suivante :


* Categorie
 *
 *
 * @ORM\Entity(repositoryClass="path\bundle\Entity\CategorieRepository")
 * @ORM\Table(name="categorie",indexes={@ORM\Index(name="recherche_index", columns={"slug"})})
 */
class Categorie {
 
    /**
     *
     * @ORM\ManyToMany(targetEntity="path\bundle\Entity\Produit", cascade={"persist"}, inversedBy="categorieCollection")
     *
     * */
    private $produitCollection;



J'espère avoir été assez explicite. Merci par avance.
Modifié par gemcod (11 Jun 2014 - 13:06)
@FraiseTagada99 : J'ai déjà fait des tests avec setMaxResult.

Je récupère une liste de catégories (j'ai donc une collection de catégories). Chaque élément de la collection (donc chaque catégorie) possède sa propre collection de produits.

setMaxResult va limiter la taille de la collection racine (c'est à dire le nombre de catégories car c'est cette entité qui fait appel au querybuilder). Si je demande la collection des catégories 10,256,21,478,63,25,84,95 par exemple et que je souhaite pour chacune d'elles les 3 premiers produits associés, je tente setMaxResult(3) et je n'obtiens que les 3 premières catégories (10,256,21) avec l'intégralité de leur collection de produits et non toutes les catégories avec leur 3 produits. Je ne sais pas appliquer le setMaxResult à la collection enfant (ici la collection de produits)

Je suis preneur de toute piste, cela fait deux jours que je cherche. Lorsque je dis deux jours, c'est plus de 20h de recherche à lire des problématique en apparence équivalentes. Il est impossible que personne n'ait rencontré cet écueil avant moi...
Modifié par gemcod (11 Jun 2014 - 13:07)