Laravel 5

Sum sur une collection avec groupement sur Annee/Mois

  • Avatar de LaraSharp
    Membre depuis :
    03/01/2018
    Messages :
    5

    A partir de cet exemple, je souhaiterais obtenir une somme par mois/année :

    $logs = Log::query();
    $logs = $logs->select(DB::raw('count(id) as data'), DB::raw('YEAR(created_at) year, MONTH(created_at) month'), 'client_id')
    ->groupby('year', 'month', 'client_id')
    ->get();

    1er Résultat obtenu :

    0: {data: 1, year: 2018, month: 7, client_id: 5}
    1: {data: 2, year: 2018, month: 9, client_id: 5}
    2: {data: 27, year: 2018, month: 10, client_id: 3}
    3: {data: 1, year: 2018, month: 10, client_id: 5}
    4: {data: 1, year: 2018, month: 10, client_id: 6}

    Je souhaiterais ensuite impérativement à partir de cette collection $logs (et non la table Log) , obtenir le résultat suivant, c'est à dire récupérer la somme par mois/année.

    0: {data: 1, year: 2018, month: 7}
    1: {data: 2, year: 2018, month: 9}
    2: {data: 29, year: 2018, month: 10}

    Quelqu'un sait-il comment faire sur une collection pour récuperer cela ?

    Fabien

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

    Salut,

    On a pas trop l'habitude de faire ça parce qu'en général on fait ce traitement dans la requête à la base mais puisqu'il faut agir impérativement à partir de cette collection...

    Je me suis un peu amusé avec les collections :

    $collection = collect([
    ['data' => 1, 'year' => 2018, 'month' => 7],
    ['data' => 2, 'year' => 2018, 'month' => 9],
    ['data' => 27, 'year' => 2018, 'month' => 10],
    ['data' => 1, 'year' => 2018, 'month' => 10],
    ['data' => 1, 'year' => 2018, 'month' => 10],
    ['data' => 1, 'year' => 2017, 'month' => 10],
    ]);

    $result = $collection
    ->groupBy(['year', 'month'])
    ->map(function ($item, $key) {
    return $item->map(function ($item, $key) {
    $first = $item->first();
    $first['data'] = $item->sum('data');
    return $first;
    });
    });

    dd($result);

    J'obtiens ça :

    Collection {#196 ▼
    #items: array:2 [▼
    2018 => Collection {#190 ▼
    #items: array:3 [▼
    7 => array:3 [▼
    "data" => 1
    "year" => 2018
    "month" => 7
    ]
    9 => array:3 [▼
    "data" => 2
    "year" => 2018
    "month" => 9
    ]
    10 => array:3 [▼
    "data" => 29
    "year" => 2018
    "month" => 10
    ]
    ]
    }
    2017 => Collection {#189 ▼
    #items: array:1 [▼
    10 => array:3 [▼
    "data" => 1
    "year" => 2017
    "month" => 10
    ]
    ]
    }
    ]
    }
  • Avatar de LaraSharp
    Membre depuis :
    03/01/2018
    Messages :
    5

    [RESOLU]
    Un grand merci BestMomo pour cette aide.
    J'avais essayé avec la fonction map que je ne connais pas trop et sum, mais je n'avais pas réussi à obtenir ce que je voulais, donc super.

Vous ne pouvez pas répondre à ce sujet.