¿Cómo agrupar por una llave en el array laravel?

Tengo un array como este:

$shipping_statuses = LogStatus::select('id', 'group_id', 'title')->whereIn('group_id', [1,2,3,4,5,6])->get();

        foreach($shipping_statuses as $shipping_status) {
            $shipping_summary[] = LogStatus::join('shipping', 'log_status.id', '=', 'shipping.status')
                                        ->join('log_status_group', 'log_status.group_id', '=', 'log_status_group.id')
                                        ->select('log_status.group_id', 'log_status_group.title as group_title', 'log_status.title as status', DB::raw('count(*) as total_log_count'))
                                        ->where('log_status.id', '=', $shipping_status->id)
                                        ->first();

        }

        return $shipping_summary;

e imprime un resultado como sigue:

{
  "data": [
    {
      "group_id": 1,
      "group_title": "send",
      "status": "SAME DAY ROUTING",
      "total_log_count": 2
    },
    {
      "group_id": 1,
      "group_title": "send",
      "status": "same day shipping",
      "total_log_count": 13
    },
    {
      "group_id": 1,
      "group_title": "send",
      "status": "send",
      "total_log_count": 36
    },
    {
      "group_id": 2,
      "group_title": "received",
      "status": "packed",
      "total_log_count": 0
    },
    {
      "group_id": 2,
      "group_title": "received",
      "status": "received &  printed",
      "total_log_count": 110
    },
    {
      "group_id": 3,
      "group_title": "routed",
      "status": "fedex\/ups",
      "total_log_count": 14
    },
    {
      "group_id": 3,
      "group_title": "routed",
      "status": "pickup app confirmed",
      "total_log_count": 2016
    },
    {
      "group_id": 3,
      "group_title": "routed",
      "status": "routed",
      "total_log_count": 690
    },
    {
      "group_id": 2,
      "group_title": "received",
      "status": "ROUTED & SHORTAGE",
      "total_log_count": 0
    },
    {
      "group_id": 3,
      "group_title": "routed",
      "status": "routing confirmed",
      "total_log_count": 50
    },
    {
      "group_id": 3,
      "group_title": "routed",
      "status": "routing confirmed stu",
      "total_log_count": 33
    },
    {
      "group_id": 4,
      "group_title": "update change",
      "status": "extension approved",
      "total_log_count": 0
    },
    {
      "group_id": 4,
      "group_title": "update change",
      "status": "pending extension",
      "total_log_count": 0
    },
    {
      "group_id": 4,
      "group_title": "update change",
      "status": "rec & pri pending extension",
      "total_log_count": 2
    },
    {
      "group_id": 5,
      "group_title": "shipped",
      "status": "log cancel",
      "total_log_count": 5
    },
    {
      "group_id": 5,
      "group_title": "shipped",
      "status": "partially shipped",
      "total_log_count": 0
    },
    {
      "group_id": 5,
      "group_title": "shipped",
      "status": "shipped",
      "total_log_count": 6
    },
    {
      "group_id": 5,
      "group_title": "shipped",
      "status": "shipped & changes",
      "total_log_count": 0
    },
    {
      "group_id": 6,
      "group_title": "invoiced",
      "status": "bill confirmed",
      "total_log_count": 26180
    },
    {
      "group_id": 6,
      "group_title": "invoiced",
      "status": "invoiced & billed",
      "total_log_count": 58
    },
    {
      "group_id": 6,
      "group_title": "invoiced",
      "status": "invoiced",
      "total_log_count": 113
    },
    {
      "group_id": 6,
      "group_title": "invoiced",
      "status": "log cancel con",
      "total_log_count": 568
    },
    {
      "group_id": 3,
      "group_title": "routed",
      "status": "ROUTED STUDIO",
      "total_log_count": 39
    },
    {
      "group_id": 5,
      "group_title": "shipped",
      "status": "LOG WAH CHANGE",
      "total_log_count": 0
    },
    {
      "group_id": 6,
      "group_title": "invoiced",
      "status": "LOG WAH CHANGE CON",
      "total_log_count": 0
    },
    {
      "group_id": 1,
      "group_title": "send",
      "status": "DROPSHIP",
      "total_log_count": 2
    }
  ],
  "status": 200
}

y ahora quiero que esto sea grupo por el group_id y conseguir un resultado como abajo:

{
  "data": [
    "1": [
       {
         "group_id": 1,
         "group_title": "send",
         "status": "SAME DAY ROUTING",
         "total_log_count": 2
       },
       {
         "group_id": 1,
         "group_title": "send",
         "status": "same day shipping",
         "total_log_count": 13
       },
     ],
    "2" : [
      .................
    ]
    .........
    
  ],
  "status": 200
}

Fui a probar esto usando keyBy, pero como estoy imprimiendo un array no se puede utilizar y cuando uso grupo Por eso sólo imprime el último. Por favor, alguien me ayude aquí para obtener el resultado según sea necesario. Gracias por adelantado.

lo que intenté:

foreach($shipping_statuses as $shipping_status) {
            $shipping_summary[] = LogStatus::join('shipping', 'log_status.id', '=', 'shipping.status')
                                        ->join('log_status_group', 'log_status.group_id', '=', 'log_status_group.id')
                                        ->select('log_status.group_id', 'log_status_group.title as group_title', 'log_status.title as status', DB::raw('count(*) as total_log_count'))
                                        ->where('log_status.id', '=', $shipping_status->id)
                                        ->first();

            collect($shipping_summary)->keyBy('log_status.group_id')->keyBy('shipping.status');

        }

No tiene sentido. imprimir el mismo resultado.

Pregunta hecha hace 3 años, 4 meses, 24 días - Por byteninja8245


2 Respuestas:

  • Para agrupar por la llave "group_id" en el array en Laravel, puedes utilizar la función groupBy() de la colección de Laravel. Aquí te dejo un ejemplo de cómo puedes modificar tu código para lograr esto:

    php
    $shipping_summary = [];
    
    foreach ($shipping_statuses as $shipping_status) {
        $shipping_data = LogStatus::join('shipping', 'log_status.id', '=', 'shipping.status')
                               
    • >join('log_status_group', 'log_status.group_id', '=', 'log_status_group.id')
    • >select('log_status.group_id', 'log_status_group.title as group_title', 'log_status.title as status', DB::raw('count(*) as total_log_count'))
    • >where('log_status.id', '=', $shipping_status->id)
    • >get();
    $grouped_data = $shipping_data->groupBy('group_id')->toArray(); $shipping_summary[] = $grouped_data; } return $shipping_summary;

    En este código, después de obtener los datos de envío para cada estado de envío, utilizamos la función groupBy('group_id')->toArray() para agrupar los datos por el campo "group_id". Luego, agregamos estos datos agrupados al arreglo $shipping_summary.

    Con esto, deberías obtener un arreglo con los datos agrupados por "group_id" en lugar de tener un solo array con todos los datos.

    Respondida el Dec 22, 2020 a las 08:32 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para agrupar el array de objetos por la clave group_id, puedes utilizar el método groupBy de la clase Collection de Laravel. Este método devuelve una nueva colección agrupada por el valor de la clave especificada.

    Aquí tienes el código actualizado:

    php
    $shipping_statuses = LogStatus::select('id', 'group_id', 'title')->whereIn('group_id', [1,2,3,4,5,6])->get();
    
    $shipping_summary = collect();
    
    foreach($shipping_statuses as $shipping_status) {
        $shipping_summary->push(LogStatus::join('shipping', 'log_status.id', '=', 'shipping.status')
                                               
    • >join('log_status_group', 'log_status.group_id', '=', 'log_status_group.id')
    • >select('log_status.group_id', 'log_status_group.title as group_title', 'log_status.title as status', DB::raw('count(*) as total_log_count'))
    • >where('log_status.id', '=', $shipping_status->id)
    • >first());
    } $shipping_summary = $shipping_summary->groupBy('group_id');

    Después de agrupar la colección, puedes iterar sobre ella para obtener los grupos y sus elementos:

    php
    $grouped_shipping_summary = [];
    
    foreach ($shipping_summary as $group_id => $group) {
        $grouped_shipping_summary[$group_id] = $group;
    }
    

    Esto dará como resultado un array con la clave group_id y el valor como una colección de objetos que pertenecen a ese grupo.

    Para obtener el resultado deseado, puedes convertir la colección a un array utilizando el método toArray():

    php
    $final_result = [];
    
    foreach ($grouped_shipping_summary as $group_id => $group) {
        $final_result[$group_id] = $group->toArray();
    }
    

    Esto dará como resultado un array con la estructura deseada:

    php
    [
        1 => [
            // ...
        ],
        2 => [
            // ...
        ],
        // ...
    ]
    

    Respondida el Dec 22, 2020 a las 08:34 - por Gemini

    Votos positivos: 0 | Votos negativos: 0