Laravel 5

Requete Query builder - récupérer des résultats sur les 12 derniers mois

  • Avatar de Sàyn
    Membre depuis :
    10/11/2015
    Messages :
    48

    Bonjour,
    J'aurais besoin d'aide sur une requête je n'y arrive pas du tout !
    j'ai deux tables
    Formations (id,intitule, etc...)
    Demandes (id,date,formation_id, etc..)

    Je voudrais pouvoir récupérer pour chaque formation distincte, le nombre de demandes trié par mois sur les 12 derniers mois, voici un exemple de résultats

    { intitule : 'formation1', demandes : ['01-2018' => 2, '02-2018 => 4, '03-2018' => 1,... ] }
    { intitule : 'formation2', demandes : ['01-2018' => 9, '02-2018 => 6, '03-2018' => 7,... ] }

    Si quelqu'un saurait m'aider !

    Alex

  • Avatar de jamalinformatique
    Membre depuis :
    21/09/2017
    Messages :
    78

    J'ai deja fait des statistique comme ça mais directement en SQL et j'ai du mettre plein de INNER JOIN ( ou LEFT JOIN )pour chaque mois desirés !

    je te conseille de creer ta requete en SQL pur et apres essayer de la convertir en query builder !

    SELECT formations.intitulé,COUNT(demandes.id) as "Janvier 2018"
    FROM Demandes
    INNER JOIN Formations on formations.id = demandes.formation_id
    WHERE Demandes.date BETWEEN ‘2018-01-01’ AND ‘2018-01-31’

    j'ai essayer de te donner un exemple mais il est pas complet.... si je m'en rappelle je te reponderai

  • Avatar de jamalinformatique
    Membre depuis :
    21/09/2017
    Messages :
    78

    par contre le type de donnée pour demandes.dates c'est du string ? peut etre serait t'il judicieux de stocker cela dans une DATE

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2178

    Tu peux essayer un truc comme ça :

    $formations = Formation::withCount(['demandes as janvier_demandes' => function ($query) {
    $query->whereYear('created_at', '2018')->whereMonth('created_at', '1');
    }])->withCount(['demandes as fevrier_demandes' => function ($query) {
    $query->whereYear('created_at', '2018')->whereMonth('created_at', '2');
    }])->withCount(['demandes as mars_demandes' => function ($query) {
    $query->whereYear('created_at', '2018')->whereMonth('created_at', '3');
    }])->get();

    Mais pour 12 mois ça va faire long...

    Si ça fonctionne tu peux créer une fonction pour construire ta requête, ça sera plus élégant.

  • Avatar de Tom
    Membre depuis :
    20/09/2018
    Messages :
    1

    Sur du postgres mais il me semble que tu peux utiliser aussi cela en MySQL.

    DB::table('demandes')
    ->select(
    DB::raw("date_trunc('month', created_at) AS month"),
    DB::raw("count(*) AS nb_demandes")
    )
    ->groupBy("month")
    //

Vous ne pouvez pas répondre à ce sujet.