Bonjour à tous,

Savez-vous si l'on peut faire une requête pivot du genre mois/année avec doctrine ?

Faut il utiliser du sql natif ? si oui, auriez vous un exemple compatible avec mariaDB ?

Ou bien faire ça avec des requêtes union + table dans twig ?

Merci d'avance pour vos aimables réponses

5 réponses


Bonjour, oui, vous pouvez effectuer une requête pivot pour regrouper des données par mois et année en utilisant Doctrine, mais Doctrine lui-même n'a pas de fonctionnalité pivot intégrée. Vous pouvez réaliser cela en utilisant des requêtes DQL (Doctrine Query Language) avec SQL natif ou en utilisant des requêtes DQL complexes.

Bonjour Tiwux, merci d'avoir répondu

Je me doutais que cela était possible mais j'ai essayé en suivant un tuto en ligne et beaucoup de fonctions ne sont pas prises en compte apparament dans MariaDB, c'est pour cela que j'aurais aimé que quelqu'un fournisse un exemple compatible avec MariaDB qui semble différer du language sql server présenté dans la majorité des tutos...

Sinon, j'avais pensé à créer 12 requêtes pour chaque mois en UNION et l'envoyer à la vue en tableau/objet ce qui est très facile à mettre en place dans Twig ensuite mais quid des ressources et de l'impact ? Y aurait-il avantage à rester sur une pivot vu l'autre solution ?

Vous pouvez effectuer une requête pivot pour regrouper des données par mois et année en utilisant Doctrine.

J'ai bien compris mais existe t'il des exemples ? J'ai vu des tutos sur sql server mais ce n'est pas compatible avec mariaDB !

Alors, pour ceux que cela pourraît intéresser il est tout à fait possible de le faire grâce à des CASE / THEN / ELSE comme par exemple ceci, rendant complètement obsolète la commande PIVOT :

Par contre, je suis passé à mysql direct car MariaDB par xampp produisait de plus en plus de corruption de tables, depuis je n'ai plus aucun problème et en plus je gère tout par le Mysql Workbench...

Cependant il faut penser à rajouter une ligne d'options dans la config doctrine, à savoir :

  dbal:
    url: "%env(resolve:DATABASE_URL)%"
    options:
      1002: 'SET sql_mode=(SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""))'
public function getTableauAnnuel()
    {
        return $this->createQueryBuilder('d')
            ->select("DISTINCT date_format(d.date_acompte,'%Y') AS Annee,
SUM(CASE WHEN MONTH(d.date_acompte)='1' THEN d.total_acompte ELSE 0 END) AS Janvier,
SUM(CASE WHEN MONTH(d.date_acompte)='2' THEN d.total_acompte ELSE 0 END) AS Fevrier,
SUM(CASE WHEN MONTH(d.date_acompte)='3' THEN d.total_acompte ELSE 0 END) AS Mars,
SUM(CASE WHEN MONTH(d.date_acompte)='4' THEN d.total_acompte ELSE 0 END) AS Avril,
SUM(CASE WHEN MONTH(d.date_acompte)='5' THEN d.total_acompte ELSE 0 END) AS Mai,
SUM(CASE WHEN MONTH(d.date_acompte)='6' THEN d.total_acompte ELSE 0 END) AS Juin,
SUM(CASE WHEN MONTH(d.date_acompte)='7' THEN d.total_acompte ELSE 0 END) AS Juillet,
SUM(CASE WHEN MONTH(d.date_acompte)='8' THEN d.total_acompte ELSE 0 END) AS Aout,
SUM(CASE WHEN MONTH(d.date_acompte)='9' THEN d.total_acompte ELSE 0 END) AS Septembre,
SUM(CASE WHEN MONTH(d.date_acompte)='10' THEN d.total_acompte ELSE 0 END) AS Octobre,
SUM(CASE WHEN MONTH(d.date_acompte)='11' THEN d.total_acompte ELSE 0 END) AS Novembre,
SUM(CASE WHEN MONTH(d.date_acompte)='12' THEN d.total_acompte ELSE 0 END) AS Decembre,
SUM(d.total_acompte) AS Total_annee")
            ->groupBy('Annee')
            ->orderBy('Annee', 'DESC')
            ->getQuery()->getScalarResult();
    }