TurkMvc TankCikisHareket modelini yıl ve aya göre gruplayıp (group by) miktar alanlarının toplamını (sum) alacaksınız. Bu size her ay için toplam miktarı verecek. Arada kayıt olmayan aylar olabilir, onları siz 0 ile dolduracaksınız böylece aylar arası boşluk olmayacak, Ocak'tan Mart'a geçmeyecek.
use Carbon\Carbon;
use Carbon\CarbonPeriod;
$startDate = Carbon::parse('2023-01-01');
$endDate = Carbon::parse('2023-12-31');
// Başlangıç tarihi ve bitiş tarihinden itibaren her 1 ayı Carbon objesi olarak içeren
// bir dizi oluşturuyoruz.
$months = CarbonPeriod::create($startDate, '1 month', $endDate)
->toArray();
$results = TankCikisHareket::select([
DB::raw('date_format(tarih, "%Y-%m") as month'),
DB::raw('sum(miktar) as total_miktar'),
])
->whereBetween('tarih', [
$startDate,
$endDate
])
->groupBy('month')
->orderBy('month')
->get();
/*
$results şu şekilde oluyor:
[
{"month": "2023-01", "total_miktar": 560},
{"month": "2023-02", "total_miktar": 1200},
{"month": "2023-03", "total_miktar": 345},
...
]
*/
$totalsByMonth = [];
// Burada boş olan aylar $results koleksiyonu içinde olmadığı için biz ekliyoruz. Bunu
// SQL ile yapmanın yolu da var ama bu daha basit olduğu için PHP ile yapıyorum.
foreach($months as $month) {
$yearMonth = $month->format('Y-m');
$totalsByMonth[$yearMonth] = $d->firstWhere('month', $yearMonth)
?->total_miktar ?? 0;
}
/*
$totalsByMonth şu şekilde oluyor:
[
{"2023-01": 560},
{"2023-02": 1200},
{"2023-03": 345},
{"2023-04": 0},
{"2023-05": 0},
{"2023-06": 0},
{"2023-07": 0},
{"2023-08": 0},
{"2023-09": 0},
{"2023-10": 0},
{"2023-11": 0},
{"2023-12": 0},
]
*/
// Bunlar sizin chart içinde x ekseninde göstereceğiniz değerler, yani etiketler.
$labels = [
"Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran",
"Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"
];
// Bu da sizin y ekseninde göstereceğiniz data. Yani chartjs içinde datasets.
// [560, 1200, 345, 0, 0, 0, 0, 0, 0, 0, 0, 0]
$data = array_values($totalsByMonth);
Bu işlemleri Blade içindeki şablonda yapmayın, controller içinde yapın, şablona sadece $labels ve $data değerlerini gönderin. Blade şablonlarını sadece veriyi göstermek için kullanın.
Kafadan yazdım, o yüzden test etme şansım olmadığı için hatalar olabilir, düzeltmek size kalıyor.