CB DIGITAL
Tüm Makalelere Dön
PHP & Laravel
1 Mart 2026

Laravel Eloquent N+1 Sorgu Problemi Nasıl Tespit Edilir ve Çözülür?

Cengiz Bozdemir
Cengiz BozdemirKurumsal Yazılım Mimarı
Laravel Eloquent N+1 Sorgu Problemi Nasıl Tespit Edilir ve Çözülür?

📌 Rehber Özeti & Hedef Çıktı

Veritabanına gereksiz binlerce sorgu gitmesini engelleyen Eager Loading (with) tekniğiyle sayfa açılışını 10 kat hızlandırma yöntemi.

1. Giriş ve Karşılaşılan Temel Zorluklar

Döngü içinde ilişkili modelleri çağırmak, 100 kayıt için 101 sorgu yapılmasına yol açar. Bu durum veritabanı CPU'sunu %100'e kilitleyebilir.

Modern kurumsal yazılım mimarisinde bu adımı doğru tasarlamak; hem uygulamanın bakım maliyetini (maintainability) düşürür hem de gelecekteki ölçekleme (scaling) süreçlerinde refactor ihtiyacını en aza indirir. Bu rehberde, sektörde kabul görmüş standartlar ışığında adım adım uygulamayı ele alıyoruz.

2. Ortam Hazırlığı ve Gerekli Bağımlılıklar

Geliştirmeye başlamadan önce sistem ortamınızın ve ilgili paketlerin hazır olduğundan emin olmalısınız. Terminalinizde aşağıdaki komutları çalıştırarak ilgili yapılandırmayı tamamlayın:

  • Adım: Geliştirme ortamında N+1 sorguları yakalamak için AppServiceProvider boot metoduna 'Model::preventLazyLoading(! app()->isProduction());' satırını ekleyin.
  • Adım: Sorguları izlemek için Laravel Debugbar veya Telescope kurun.

3. Uygulama Mimarisi ve Kod Örneği

Aşağıdaki kod bloğunda, temiz kod (Clean Code) prensiplerine ve SOLID standartlarına uygun olarak tasarlanmış örnek implementasyonu inceleyebilirsiniz:

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index()
    {
        // YANLIŞ: Post::all() -> N+1 oluşturur
        // DOĞRU: with() ile Eager Loading
        $posts = Post::with(['author:id,name', 'comments.user:id,name'])
            ->where('is_published', true)
            ->latest()
            ->paginate(20);

        return view('posts.index', compact('posts'));
    }
}

4. Kod Analizi ve Çalışma Mantığı

with(['author:id,name']) ifadesi, tüm yazarları tek bir 'IN (?,?,?)' SQL sorgusu ile çeker. Toplam sorgu sayısı 101'den sadece 2'ye iner.

Yukarıdaki implementasyonda dikkat edilmesi gereken en kritik husus, işlemlerin bağımsız (decoupled) ve test edilebilir şekilde katmanlara ayrılmış olmasıdır. Bu yaklaşım, birim testlerin (Unit Tests) ve entegrasyon testlerinin hızlıca yazılabilmesine olanak tanır.

5. Performans ve Güvenlik İpuçları

Canlı üretim (production) ortamında sistemin kararlı çalışması için aşağıdaki pratikleri mutlaka dikkate almalısınız:

  • İlişkili tablolarda 'select id, name' şeklinde yalnızca gerekli kolonları getirin.
  • Koşullu yüklemeler için withWhereHas metodunu tercih edin.
  • Test süreçlerinde sorgu sayacı koyarak regressyonları engelleyin.

6. En Sık Yapılan Hatalar ve Hata Ayıklama (Troubleshooting)

Lazy loading'i kapatmadan canlıya çıkmak; yoğun trafikte veritabanı kilitlenmelerinin (connection exhaustion) 1 numaralı sebebidir.

Eğer beklenmedik bir hata ile karşılaşırsanız; öncelikle log dosyalarını incelemeli, ortam değişkenlerinin (.env) doğru tanımlandığını doğrulamalı ve önbellek (cache) mekanizmalarını temizleyerek sistemi yeniden başlatmalısınız.

7. Sonuç ve Mimari Değerlendirme

Eager loading bilinci, acemi geliştirici ile profesyonel kurumsal mimar arasındaki en belirgin ayrımdır.

Cengiz Bozdemir olarak 18 yılı aşkın kurumsal yazılım mimarlığı deneyimimle tavsiyem; sistem tasarımında her zaman sürdürülebilirlik, güvenlik ve yüksek eşzamanlılık (high concurrency) hedeflerini ön planda tutmanızdır. Kurumsal projelerinizde özel mimari danışmanlık veya uçtan uca yazılım geliştirme desteği için bizimle iletişime geçebilirsiniz.

#laravel#eloquent#n+1 query#eager loading#database#sql
Cengiz Bozdemir

Cengiz Bozdemir

Kurumsal Yazılım Mimarı & Full-Stack Geliştirici

İşletmeniz veya girişiminiz için yüksek performanslı sistemler, özel yazılımlar ve yapay zeka otomasyonları inşa ediyorum.

KURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITALKURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITALKURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITALKURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITAL
© 2026 CB DIGITAL Tüm hakları saklıdır.