Selam millet, uzun zamandır Laravel ile çalışıyorum ama son zamanlarda can sıkıcı bir sorunla karşılaştım. Eager loading kullanarak ilişkisel verileri çekmek genelde performans için iyi bir yöntemdir, ama ben projede with() metoduyla 5-6 tane ilişkiyi aynı anda yüklemeye çalışınca bellek patlaması yaşıyorum. Özellikle kullanıcıların siparişlerini, siparişlerin ürünlerini ve ürünlerin kategorilerini iç içe çekmeye kalktığımda, 10 bin kayıtta bile memory_limit hatası alıyorum. Normalde lazy loading daha mı mantıklı olur yoksa ben mi yanlış kullanıyorum?
Bir de şu var, eager loading ile gelen verileri toArray() veya json_encode ile dönüştürürken işler daha da kötüleşiyor. Sanırım Laravel tüm ilişkisel verileri hafızada tutuyor ve sonra bunları serialize ederken katlıyor. Mesela User::with('orders.products.category')->get() yaptığımda, her bir kullanıcı için tüm siparişleri ve o siparişlerin ürünlerini ayrı ayrı nesne olarak yüklüyor. Normalde bu veriyi sayfalama yapsam da arka planda tüm dataseti çekmiş oluyor galiba. chunk() kullanmayı denedim ama bu sefer de ilişkiler düzgün gelmiyor, çünkü chunk sorguyu bölüyor ama with() içindeki ilişkiler hala ana sorguya bağlı.
Sizde durumlar nasıl? Özellikle büyük projelerde eager loading ile bellek sorunu yaşayan var mı? Belki de query builder ile raw join yapmak daha sağlıklı olabilir diye düşünüyorum. Ya da bellek limitini artırmak dışında bir çözüm var mı? Mesela select ile sadece ihtiyacımız olan kolonları almak işe yarıyor mu? Deneyimlerinizi paylaşırsanız sevinirim, gerçekten kafayı yemek üzereyim. :)
Bir de şu var, eager loading ile gelen verileri toArray() veya json_encode ile dönüştürürken işler daha da kötüleşiyor. Sanırım Laravel tüm ilişkisel verileri hafızada tutuyor ve sonra bunları serialize ederken katlıyor. Mesela User::with('orders.products.category')->get() yaptığımda, her bir kullanıcı için tüm siparişleri ve o siparişlerin ürünlerini ayrı ayrı nesne olarak yüklüyor. Normalde bu veriyi sayfalama yapsam da arka planda tüm dataseti çekmiş oluyor galiba. chunk() kullanmayı denedim ama bu sefer de ilişkiler düzgün gelmiyor, çünkü chunk sorguyu bölüyor ama with() içindeki ilişkiler hala ana sorguya bağlı.
Sizde durumlar nasıl? Özellikle büyük projelerde eager loading ile bellek sorunu yaşayan var mı? Belki de query builder ile raw join yapmak daha sağlıklı olabilir diye düşünüyorum. Ya da bellek limitini artırmak dışında bir çözüm var mı? Mesela select ile sadece ihtiyacımız olan kolonları almak işe yarıyor mu? Deneyimlerinizi paylaşırsanız sevinirim, gerçekten kafayı yemek üzereyim. :)