Sizin yazdıklarınızı kullandım
GirislerAylikController içeriği
<code><?php
namespace App\Http\Controllers;
use App\Models\Girisler;
use App\Models\Tedarikci;
use App\Models\Urun;
use Illuminate\Http\Request;
use Carbon\CarbonPeriod;
class GirislerAylikController extends Controller
{
public function index()
{
$urunler = Urun::all();
$tedarikciler = Tedarikci::all();
return view('aylikgirisler',compact('urunler','tedarikciler'));
}
public function listele(Request $request)
{
// Bitiş tarihi yani seçilen tarih
$endDate = $request->date('tarih');
// Başlangıç tarihi, bitiş tarihinden 10 gün öncesi
$startDate = $endDate
->copy()
->subDays(10);
// Burada başlangıç ve bitiş tarihi arasında, 1 gün arayla tarih dizisi oluşturuyoruz
// $dates artık 10 elemanlı bir dizi
$dates = CarbonPeriod::create($startDate, $endDate);
// Önce istediğimiz kayıtları çekelim:
$records = Girisler::whereBetween('tarih', [$startDate, $endDate])
->select('urun_id', 'tedarikci_id', 'toplam', 'tarih')
->latest('tarih')
->get();
// Çekilen kayıtlarda kullanılan ürünlerin id lerini alıyoruz
// Aynı üründen birden fazla olabileceği için unique ile kopyaları kaldırıyoruz
$productIds = $records
->pluck('urun_id')
->unique()
->values()
->toArray();
// Çekilen kayıtlarda geçen tedarikçi id lerini alıyoruz. Aynı şekilde kopyaları kaldırıyoruz
$supplierIds = $records
->pluck('tedarikci_id')
->unique()
->values()
->toArray();
// Kullanılan ürünleri id => name olacak şekilde selectbox oluşturmak için çekiyoruz.
// Sadece id ve name yeterli
$productSelectbox = Urun::whereIn('id', $productIds)
->select('id', 'name')
->pluck('name', 'id');
// Tablodaki ilk sütunda listelemek için tedarikçileri çekiyoruz. Sadece id ve name yeterli
$suppliers = Tedarikci::whereIn('id', $supplierIds)
->select('id', 'name')
->get();
// Her bir tarih sütununda göstermek üzere toplamları alıyoruz. Burada yaptığım işlem önce kayıtları
// tarihe göre gruplamak. Daha sonra bu grupları da kendi içinde tedarikci_id ye göre grupluyorum.
// Son olarak da en son elde ettiğim grupdaki toplamları da toplayıp genel toplam elde ediyorum.
$columns = collect($records)
->groupBy('tarih')
->map(function($items) {
return $items
->groupBy('tedarikci_id')
->map(fn($items) => $items->sum('toplam'));
})
->toArray();
dd($suppliers);
return view('aylikgirisler',compact('dates', 'suppliers', 'productSelectbox', 'columns'));
}
}
</code>