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.
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 :
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 :
J'espère avoir été assez explicite. Merci par avance.
Modifié par gemcod (11 Jun 2014 - 13:06)
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)