controllerda with kullanımı veya blade template üzerinden relation chain yapmak - Laravel Türkiye Forumları
Forumda kod paylaşılırken dikkat edilmesi gerekenler. (Lütfen okuyunuz.)
Laravel Türkiye Forumları
Yükleniyor...
Bu site en iyi modern tarayıcılarda Javascript etkinken görüntülenir.
Sayfayı tamamen yüklerken bir şeyler ters gitti.
controllerda with kullanımı veya blade template üzerinden relation chain yapmak
umutyerebakmaz
Merhaba dostlar bu sistem nasıl davranıyor arkaplanda merak ediyorum.
Controller içerisinde relationu with ile çağırmak ile blade template içerisinde $orderDetail->deliveryAddress->name şeklinde çağırmak arasında arka planda ne gibi farklılıklar var acaba ?
mgsmus
umutyerebakmaz Controller içinde OrderDetail getirirken with('deliveryAddress') kullanmazsanız OrderDetail için tek sorgu atılır, şablon render edilince orada ilişkiyi çağırdığınız için ikinci sorgu şablon render edildiği sırada atılır.
Controller içinde with('deliveryAddress') kullanırsanız 2 sorgu da orada atılır, şablon render edilirken başka sorgu atılmaz çünkü hem OrderDetail hem de deliveryAddress ilişkisi şablondan önce zaten $orderDetail değişkenine yüklenmiştir.
Günün sonunda her iki şekilde de 2 sorgu atılır ama şablonda kullandığınız ifade belli bir şarta göre işleniyorsa, if bloğu içindeyse, yani sorgunun yapılmama ihtimali varsa controller içinde with kullanmamak size 1 sorgu tasarrufu kazandırır.
Genel olarak önerdiğim değişkenlerin mümkün olduğunca controller içinde oluşturulması ve şablonların sadece veriyi göstermek için kullanılması. Sizin örnek HasOne olduğu için bir çok büyük fark olmuyor, genellikle foreach gerektiren ve/veya iç içe ilişki yüklenen durumlarda büyük farklar oluşur.
Ayrıca API yazarken ve Blade kullanırken durum değişiyor.
umutyerebakmaz
Mustafa hocam merhaba, hasOne kullanımında fark etmedim doğru bir noktaya parmak bastınız, ne yaparsam yapayım 8 query gösteriyor (benim için) debugbar. Şimdi yaptığınız yorumu okuyunca kaçırdığım kısmı gördüm. Hala componentleri en güzel şekilde manage etmek için temel prensipleri anlamya çalışıyorum. Aklımda with kullanmadan viewa veri gelmediğini hatırlıyorum. Teşekkürler.
mgsmus
umutyerebakmaz with('deliveryAddress') kullanmadığınızda $orderDetail->deliveryAddress; arka planda $orderDetail->deliveryAddress()->first(); yapar (yani sorgu atar) ve OrderDetail::$deliveryAddress değişkenine dönen collection objesini yükler. O yüzden $orderDetail->deliveryAddress->name yaptığınızda with kullanmasanız dahi name alanına ulaşabiliyorsunuz. with kullandığınızda bu işlemi önce yapmış oluyorsunuz, OrderDetail::$deliveryAddress zaten yüklenmiş bir collection olarak geliyor. Diğer bir yol da load ya da loadMissing kullanmak, yani lazy: