J'ai donc vu de nombreux sujets sur mon problème (le plus grand par groupe), mais il semble que je ne peux tout simplement pas le faire fonctionner avec le queryBuilder! (par exemple: post ) Category peut prendre les valeurs suivantes: tech / sports / games .. et ainsi sur. Dans mon NewsRepository en utilisant le queryBuilder, je voudrais renvoyer les dernières publiées nouvelles de chaque catégorie . Taxonomie :: WORKFLOW_PUBLISHED étant une constante de classe stockant: 'publié'
Ensuite, dans un service, je ne fais qu'itérer les résultats renvoyés par la méthode précédente et extraire les dernières nouvelles par catégorie. J'ai essayé avec un groupby sur les catégories, mais ce n'était pas renvoyer les dernières valeurs.
J'utilise symfony 4.2.2 Entities
return $this->createQueryBuilder('a')
->select('n news', 'n.publicationDate pubDate')
->leftJoin('n.category', 'c')
->addSelect('c.value category')
->leftJoin('n.status', 's')
->addSelect('s.value status')
->andWhere('s.value = :st')
->setParameter('st', Taxonomy::WORKFLOW_PUBLISHED)
->orderBy('n.category, n.datePublication', 'DESC')
->getQuery()
->getResult();
Statut peut prendre les valeurs suivantes: brouillon / planifié / publié. Ce que je veux
Ce que j'ai fini par faire
------------- -------------
News Taxonomy
------------- -------------
id id
title name
category (ManyToOne Taxonomy) value
status (ManyToOne Taxonomy)
publication_date
Je n'aime pas cette solution temporaire, donc si quelqu'un pouvait m'aider avec le queryBuilder, ce serait génial! + Informations supplémentaires
Si possible, je recherche également de bonnes performances.
3 Réponses :
comme group by ne se soucie pas de l'ordre des données, vous ne pouvez pas le faire par une seule requête.
il vaut mieux utiliser groupe par catégorie et sélectionner max (n.id) puis une autre requête pour trouver des actualités pertinentes par ces identifiants
salut, je suis conscient de cette possibilité, mais je voudrais une solution avec le constructeur de requêtes car c'est la raison pour laquelle je suis en difficulté.
avez-vous essayé groupBy dans votre requête ou dans votre formulaire?
Peut-être que les options "group_by" du formulaire feront l'affaire:
'query_builder' => function(NewsRepository $r)use($options) { return $r->yourQuery($options['opt']); }, 'group_by' => function(News $news) { return $news->getCategory()->getName(); },
Je veux dire, si vous utilisez orderBy dans votre requête pour obtenir les dernières nouvelles, et utilisez le 'group_by' dans le formulaire par nom de catégorie cela fonctionnera.
Obtenez la commande par query_builder, et enfin triez avec l'option group_by dans le formulaire .
salut, j'ai essayé groupBy dans la requête. Dans mon cas, il n'y a pas de formulaires impliqués.
Si vous voyez le message original: Doctrine Query Language get Max / Dernière ligne par groupe , vous aurez besoin d'une auto-jointure pour votre entité Actualités
afin d'organiser les données souhaitées (dernières actualités par catégorie), après avoir peaufiné la publication d'origine, votre générateur de requêtes pourrait ressembler comme
return $this->createQueryBuilder('a') ->select('n news', 'n.publicationDate pubDate') ->leftJoin( 'AppBundle\Entity\News', 'n1', 'WITH', 'n.category = n1.category AND n.datePublication < n1.datePublication' ) ->leftJoin('n.category', 'c') ->addSelect('c.value category') ->leftJoin('n.status', 's') ->addSelect('s.value status') ->where( 'n1.datePublication IS NULL' ) ->andWhere('s.value = :st') ->setParameter('st', Taxonomy::WORKFLOW_PUBLISHED) ->orderBy('n.category, n.datePublication', 'DESC') ->getQuery() ->getResult();