1
votes

Symfony Doctrine QueryBuilder - Obtenez les dernières nouvelles publiées de chaque catégorie

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 )
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();

Category peut prendre les valeurs suivantes: tech / sports / games .. et ainsi sur.
Statut peut prendre les valeurs suivantes: brouillon / planifié / publié.

Ce que je veux

Dans mon NewsRepository en utilisant le queryBuilder, je voudrais renvoyer les dernières publiées nouvelles de chaque catégorie .

Ce que j'ai fini par faire

-------------                    -------------
News                             Taxonomy
-------------                    -------------
id                               id
title                            name
category (ManyToOne Taxonomy)    value
status (ManyToOne Taxonomy)
publication_date

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.
Je n'aime pas cette solution temporaire, donc si quelqu'un pouvait m'aider avec le queryBuilder, ce serait génial!

+ Informations supplémentaires

J'ai essayé avec un groupby sur les catégories, mais ce n'était pas renvoyer les dernières valeurs.
Si possible, je recherche également de bonnes performances.


0 commentaires

3 Réponses :


0
votes

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


1 commentaires

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é.



0
votes

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 .


1 commentaires

salut, j'ai essayé groupBy dans la requête. Dans mon cas, il n'y a pas de formulaires impliqués.



0
votes

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();


0 commentaires