[silindi] Bir ilişkiyi adıyla özellik gibi çağırdığınızda sorgusu çalışır ve tekil ise modeli çoğul ise Collection olarak sonucu verir:
// Size ShoppingSession modelini verir:
$shoppingSession = Auth::user()->shoppingSession;
Eğer ilişkiyi yöntem olarak () ile bitirirseniz sorgu yapmaz, size Eloquent Builder verir, böylece sorguya devam edebilirsiniz:
// Size aynı şekilde ShoppingSession modelini verir:
// Auth::user()->shoppingSession; ile aynı şeydir.
$shoppingSession = Auth::user()
->shoppingSession()
->first();
// Her ne kadar ilişki BelongsTo şeklinde tekil olsa da first yerine get kullandığınız için
// içinde bir tane ShoppingSession modeli olan bir Collection verir:
$shoppingSessions = Auth::user()
->shoppingSession()
->get();
// o yüzden
$shoppingSession = $shoppingSessions->first();
Bu durumda:
$products = Auth::user()
->shoppingSession
->shoppingCart
->products() // Burada tekrar Builder'a döndük
->whereHas('product_stocks', function($query) {
$query->where('quantity', '<', 1);
})
->get();
Laravel'in güncel versiyonunu kullanıyorsanız:
$products = Auth::user()
->shoppingSession
->shoppingCart
->products() // Burada tekrar Builder'a döndük
->whereRelation('product_stocks', 'quantity', '<', 1)
->get();
Mesela sepeteki ilk ürünün stokları üzerinde işlem yapmak isteseydik:
$products = Auth::user()
->shoppingSession
->shoppingCart
->products
->first() // Product modeli verdi, sorgu yapıldı
->productStocks() // Builder'a döndük, çıkış noktamız artık Product::find($ilkUrunId)->productStocks()
->where('quantity', '<', 1) // Artık product_stocks tablosunda işlem yapıyoruz
->get(); // İkinci sorgu yapıldı, kayıt varsa bize ProductStock collection'ı verecek
Bu Collection ile de yazılabilir:
$products = Auth::user()
->shoppingSession
->shoppingCart
->products
->first() // Product modeli verdi, sorgu yapıldı
->productStocks
->where('quantity', '<', 1) // Bu Builder::where() değil Collection::where()
->all(); // Collection olduğu için Collection::all() kullanıyoruz, Collection::get() farklı bir iş yapıyor
Verdiğim örneği tamamen Builder ile yazmak isteseydik:
$products = Auth::user()
->shoppingSession()
->first()
->shoppingCart()
->first()
->products() // Burada tekrar Builder'a döndük
->whereRelation('product_stocks', 'quantity', '<', 1)
->get();
olacaktı. Tabi burada her işlemin bir kayıt getirdiğini varsayıyorum, yoksa ilk null dönen yerde hata alacaksınız. O yüzden özellike Builder olan yerlerde dikkatli olmanız lazım.