hakanylmz
Sale::query();
Burada select() ile sadece ihtiyacınız olan alanları seçin.
paginate($perPage)
Eğer kayıtlar ara ara değişiyorsa, örneğin kullanıcı ekrana bakarken değişme durumu varsa simplePaginate() kullanın, eğer arşiv verisi gibi çok sabit ise cursorPaginate() kullanın. paginate() kullandığınız için her istekte toplam aldığı gibi bir de sayfa ilerledikçe daha da yavaşlar. Kayıt sayısı çoksa 1 2 3 4... gibi bir sayfalamaya ihtiyacınız yok.
with(['invoices', 'payment'])
Burada sadece ihtiyacınız olan alanları çekin. with(['invoices:id,sale_id,created_at', 'payment:id,sale_id,amount']) gibi. Eğer eager loading ile yüklenen ilişki içerisinde Sale modelinin ilişki anahtarı varsa, sale_id gibi, onu da kullanmasanız dahi bu seçili alanlara eklemeniz lazım, yoksa ilişkiyi kuramaz.
whereYear('confirmed_date', '>=', 2023)
confirmed_date alanında index olacak bu gerekli ama siz bu şekilde yaparsanız o indexi büyük ihtimalle yine kullanmaz. O yüzden where('confirmed_date', '>=', '2023-01-01')
yapabilirsiniz.
$query->orderBy($sortBy, $orderBy)
Burada $sortBy alanı bir varchar ya da timestamp ise o alana da index atmanız lazım. Ayrıca burada bir güvenlik açığı var. Sadece belli $sortBY değerli alabileceğinden emin olun. Aynısı $perPage için de geçerli, mutlaka bir maks değer belirleyin onu geçemesin.