gundogduyakici İpucunu verdim, calendar table. Bu bir tabloda 1 yıllık günleri tuttuğunu düşün. Bu tablodan select yapıyorsun 12 ayı çekiyorsun, elinde 12 satır oluyor, sonra veriyi almak istediğin tabloya left join yapıyorsun ve grupluyorsun. MySQL 8 kullanıyorsan belki table kullanmadan da dizi ile join yapmanın yolu vardır belki. PostgreSQL'de generate_series kullanıyorum bunun için. Size bir projemden örnek kod vereyim:
$dailyExpenses = DB::query()
->select([
DB::raw("expense_date::date AS expense_date"),
DB::raw("ws.total_amount"),
])
->fromRaw("generate_series(?::timestamp, ?, '1 day') AS expense_date", [
$startOfMonth,
$endOfMonth
])
->leftJoinSub(
Expense
::select([
DB::raw("sum(amount) as total_amount"),
DB::raw("date_trunc('day', expense_at) as expense_daily_date"),
])
->where('company_id', $companyId)
->groupBy('expense_daily_date'),
'ws',
function (JoinClause $join) {
$join->on('ws.expense_daily_date', '=', 'expense_date');
}
)
->get()
->map(function ($expense) {
return [
'expense_date' => $expense->expense_date,
'total_amount' => $expense->total_amount,
];
})
->toArray();
[
{
"expense_date": "2022-10-01",
"total_amount": 13456
},
{
"expense_date": "2022-10-02",
"total_amount": 10100
},
...
{
"expense_date": "2022-10-31",
"total_amount": 96778
}
]