Laravel’da, cursor() metodu, büyük veritabanı veri setleri üzerinden etkili bir şekilde iterasyon yapmak için kullanılır. Bu yöntem, bellekte yalnızca tek bir kaydı tutarak çalışır. get() metodunun aksine, tüm sonuç kümesini bir diziye yüklemek yerine, cursor() PHP jeneratörlerini kullanarak kayıtları birer birer verir.
1. Temel Kullanım
cursor() metodunu, Eloquent veya Query Builder zincirinin sonunda çağırabilirsiniz. Bu, üzerinde döngü yapabileceğiniz bir LazyCollection örneği döner.
use App\Models\User;
foreach (User::where('active', true)->cursor() as $user) {
// Tek bir kullanıcıyı işleme al
echo $user->name;
}
2. Ana Özellikler
- Tek Sorgu Çalıştırma:
chunk()metodu, her grup kaydı için yeni bir sorgu çalıştırırken,cursor()yalnızca bir SQL sorgusu çalıştırır. - Hafıza Verimliliği: Tüm alınan nesneler için büyük bir koleksiyon oluşturmaya gerek kalmadığı için bellekteki kullanım önemli ölçüde azalır.
- Lazy Collections: Laravel 6.0’dan itibaren,
cursor()birLazyCollectiondöner; bu sayedefilter(),map()veeach()gibi koleksiyon metodlarını yüklemeden zincirleyebilirsiniz. - Eager Loading Sınırlaması:
with()metodu ilecursor()kullanmak verimsiz olabilir çünkü Laravel hala tüm ana ID’leri yüklemek zorunda kalabilir, bu durum bazı bellek avantajlarını bertaraf edebilir.
Diğer Yöntemlerle Karşılaştırma
cursor() bellek açısından son derece verimlidir, ancak Laravel hala chunk() metodunu içermektedir çünkü her iki yöntem de farklı sorunları çözmektedir. chunk() metodunu, toplu işlemler (örneğin, kayıt güncellemeleri) yaparken veya ilişkileri yüklemek istediğinizde kullanın; cursor() ise bellek öncelikli olduğunda ve yalnızca veri okuma işlemi yürüttüğünüzde tercih edilmelidir.
Her Birini Ne Zaman Kullanmalısınız?
Doğru seçim, belirli görevinize bağlıdır:
Güncelleme veya ağır işlem için chunk() kullanın.
- Neden: Verileri gruplar halinde (örneğin, her seferinde 1,000) işleyerek, veritabanı işlemleri için daha hızlıdır; kayıt başına toplam yükü minimizasyon eder.
- Güvenlik Önlemi: Aynı kayıtları güncellerken
chunkById()kullanarak veri atlamaları veya tekrarlarını önleyin.
Büyük veri kümesi (1M+ kayıt) veya akış için cursor() kullanın.
- Neden: Tek bir sorgu kullanarak birer birer kayıt alır; sonucun boyutundan bağımsız olarak bellekteki kullanım sabit kalır.
- En İyi Kullanım: Büyük bir CSV oluşturmak gibi basit dışa aktarma işlemleri veya birçok ilişkili modeli yüklemenize gerek olmayan okuma döngüleri için idealdir.
Küçük koleksiyonlar için basit iterasyonlarda each() kullanın.
- Not: Büyük veri setleri bağlamında
each(), genellikle birchunkveya koleksiyon üzerinde bir metod olarak kullanılır.Model::all()->each()çağrısı, her şeyi önce belleğe yükleyecektir; bu da büyük setler için tehlikeli bir durumdur.
Kaynak: Orijinal Makale



