Giriş
Giriş
Bu makale, Laravel uygulamanızda Eloquent sorgularını optimize etmenin yollarını ele almakta, özellikle N+1 sorgu problemini ve paylaşılabilir mantığı model katmanına ayırmayı incelemektedir. Yönetici tablolarında veri filtreleme performansını artırmaya odaklanacağız.
N+1 Sorgu Problemi
N+1 Sorgu Problemi
N+1 sorgu problemi, uygulamanızın bir kayıt kümesini almak için bir veritabanı sorgusu yürütmesi ve ardından bu kayıtlara ait ilişkili verileri almak için her biri için ek sorgular yürütmesi durumudur. Bizim durumumuzda, Tenant::all(), her kiracı için aboneliklerin tembel bir şekilde yüklenmesi nedeniyle N+1 sorgu problemine neden oluyordu.
Eager Loading ile Aboneliklerin Yüklenmesi
Eager Loading ile Aboneliklerin Yüklenmesi
N+1 sorgu probleminden kurtulmak için, abonelikleri kiracılarla birlikte tek bir sorguda almak için eager loading kullanabiliriz. Bu, veritabanı sorgularının sayısını N+1’den 1’e düşürerek performansı önemli ölçüde artırır.
$tenants = Tenant::with('subscriptions')->get();
Paylaşılan Mantığı Modelde Ayırma
Paylaşılan Mantığı Modelde Ayırma
TenantResource ve UserResource içinde plan filtreleme ile ilgili tekrarlanan mantıklar tespit edildi. Kod tekrarını azaltmak ve sürdürülebilirliği artırmak için bu mantığı Plan modeline taşıdık.
getActiveFilterOptions()
getActiveFilterOptions()Bu yöntem, farklı kaynaklarda tutarlılığı sağlamak için plan filtreleme seçeneklerini sunar.
// Plan.php
public static function getActiveFilterOptions(): array
{
return self::query()->pluck('name', 'slug')->toArray();
}
getTenantIdsForPlanSlug()
getTenantIdsForPlanSlug()Bu yöntem, belirli bir plan slug’ına bağlı kiracı ID’lerini alır ve filtreleme mantığını Plan modelinde merkezileştirir.
// Plan.php
public static function getTenantIdsForPlanSlug(string $planSlug): array
{
return Tenant::whereHas('subscriptions', function ($query) use ($planSlug) {
$query->where('plan_slug', $planSlug);
})->pluck('id')->toArray();
}
Faydalar
Faydalar
- Geliştirilmiş Performans: Eager loading, N+1 sorgu problemini ortadan kaldırarak veritabanı yükünü azaltır ve yanıt sürelerini iyileştirir.
- Kod Tekrarı: Paylaşılan mantığın
Planmodeline çıkarılması, kod tekrarını azaltır ve sürdürülebilirliği artırır. - Bakım Kolaylığı: Filtreleme mantığının merkezileştirilmesi, güncellemeleri ve bakımı kolaylaştırır.
İlerleyen Adımlar
İlerleyen Adımlar
Sık erişilen filtreleme seçenekleri için önbellekleme stratejileri uygulamayı düşünün ve ayrıca sorgu scopes kullanarak model içinde yaygın filtreleme mantığını kapsüllenmiş şekilde inceleyin.
Kaynak: Orijinal Makale


