@dk-web

Как сделать многоуровневую группировку значений таблицы?

Есть простая таблица

source | type | price
1 | нал | 100
1 | нал | 200
1 | безнал | 150
2 | нал | 150
2 |безнал| 400
2 |безнал| 500
Хочу получить сводную таблицу сумм с двойной группировкой.

array (2)
- source 1 array (2)
-- нал 300
-- безнал 150
- source 2 array (2)
-- нал 150
-- безнал 900

и т.д.

return DB::table('orders')
                     ->select('source','type', DB::raw('sum(price) as total_price'))
                     ->whereBetween('created_at', array(Carbon::yesterday()->startOfDay(), Carbon::yesterday()->endOfDay()))
                     ->groupBy('source','type')
                     // ->groupBy('type')
                     ->get();


UPD:
Сейчас я получаю...
array:3 [▼
  0 => {#185 ▼
    +"source": "1"
    +"type": "Безнал"
    +"total_price": 433.0
    +"total_cash": 433.0
  }
  1 => {#189 ▼
    +"source": "1"
    +"type": "Нал"
    +"total_price": 661.0
    +"total_cash": 350.0
  }
  2 => {#190 ▼
    +"source": "2"
    +"type": "Нал"
    +"total_price": 455.0
    +"total_cash": 0.0
  }
]

соответственно мне бы нужно сгруппировать 1 и 2 массивы...

UPD2:
Вот что получилось сделать.... запрос тот же, но применил коллекцию...
$sum=collect($this->orders->forUserSum($request->user()));
$grouped = $sum->groupBy('source');
$grouped->toArray();
dd($grouped);


Результат.
Collection {#177 ▼
  #items: array:2 [▼
    "1" => Collection {#189 ▼
      #items: array:2 [▼
        0 => {#191 ▼
          +"source": "1"
          +"type": "Безнал"
          +"total_price": 433.0
          +"total_cash": 433.0
        }
        1 => {#192 ▼
          +"source": "1"
          +"type": "Нал"
          +"total_price": 661.0
          +"total_cash": 350.0
        }
      ]
    }
    "2" => Collection {#185 ▼
      #items: array:1 [▼
        0 => {#193 ▼
          +"source": "2"
          +"type": "Нал"
          +"total_price": 455.0
          +"total_cash": 0.0
        }
      ]
    }
  ]
}


сильный колхоз? "прямее" можно?
  • Вопрос задан
  • 753 просмотра
Решения вопроса 1
wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.
Передаем в view:
DB::table('orders')
     ->select('source','type', 'price')
     ->whereBetween('created_at', array(Carbon::yesterday()->startOfDay(), Carbon::yesterday()->endOfDay()))
     ->get()->groupBy('source');


Весь вывод реализуется на blade:
<table>
   <tr>
      <th>Source</th>
      <th>Нал</th>
      <th>Безнал</th>
   </tr>
   @foreach($rows as $source => $row)
	<tr>
	   <td>{{ $source }}</td>
	   <td>{{ $row->where('type', 'нал')->sum('price') }}</td>
	   <td>{{ $row->where('type', 'безнал')->sum('price') }}</td>
         </tr>
    @endforeach
   </table>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы