Merhaba Mobilhanem.com takipçileri,
Bu yazımda Laravel Query Relation Kullanımı anlatmaya çalışacağım.
Laravel Query Relation Kullanımı
Daha önceki derslerimizde incelediğimiz eloquent relation methodlarından olan one to many ilişkisi üzerinden devam edeceğim.
WordPress sistemini düşündüğümüzde bir kullanıcının (User) birden fazla yazısı (Post) olabilir. Bu durumda kullanıcı id si 1 olanların yazılarını bulmak için
$user = App\User::find(1); $posts = $user->posts()->get();
şeklinde kod bloğu yeterli olacaktır. Gördüğünüz gibi ekstra bir sql yazmadan kullanıcının tüm yazılarını bu şekilde bulabiliriz.
Ayrıca diğer methodları da kullanabiliriz. Örneğin where ve orWhere methodlarının kullanıma bakalım
$user = App\User::find(1); $active_posts = $user->posts()->where('active', 1)->get();
$user = App\User::find(1); $posts = $user->posts()->where('active', 1)->orWhere('like', '>', 10)->get(); // select * from posts where user_id = 1 and active = 1 or like >= 100
Buradaki hatayı sql bloğundan da görebilirsiniz. Üstteki sorguda like i 100den fazla ya da eşit olan tüm postlar sergilenir. Bunu engellemek için where bloğunu gruplama sistemini kullanamız gerekli.
Bunun için
$user = App\User::find(1); $posts = $user->posts() ->where(function ($query) { return $query->where('active', 1) ->orWhere('like', '>=', 100); }) ->get(); // select * from posts where user_id = 1 and (active = 1 or like >= 100)
şeklinde yaptığımızda active = 1 olan veya like verisi 100den fazla ya da eşit olanlar listelenir ama bu durumda sadece user_id bilgisi 1 olan postlar listelenir.
Laravel query relation kullanımı sırasında aklımızda tutmamız gereken aslında bu method lazy loading ile çekildiğidir. Yani kullanmadığınız sırada bir sorgu oluşturmuyor veritabanı üzerinde. Bu da gereksiz kaynak kullanımının önüne geçmektedir.
Laravel Query Relation Kullanımı N + 1 Sorunu
Kullandığımız relation methodlarında N + 1 olarak adlandırdığımız bir sorun oluşmakta. Bunun sebebini şu şekilde açıklamaya çalışacağım. Üst tarafta verdiğimiz örneğin tersini düşünelim. Yani yazı (Post) üzerinden kullanıcı (User) bilgilerine ulaşmaya çalışalım.
$posts = App\Post::all(); foreach ($posts as $post) { echo $post->user->name; }
Yukarı yer alan kod bloğu ile 10 adet yazıyı listeleme sayfası ile gösterdiğimizi düşündüğümüzde her yazı için ekstra olarak ayrı bir user sorgusu yapacaktır. Bu yüksek veri içeren sistemlerde tabi ki büyük bir sorun olacaktır. Tabi laravel yapısının bunun içinde bir çözümü var.
Eager Loading
Eager loading kullanarak yazıları (post) çekerken kullanıcı bilgilerini de çekebilir böylece yukarıdaki gibi 11 sorgu değil sadece 2 sorgu yaparız.
$posts = App\Post::with('user')->get(); foreach ($posts as $post) { echo $post->user->name; } // select * from posts // select * from users where id in (1, 2, 3, 4, 5, ...)
Mobilhanem.com için yazdığım bu yazı umarım yardımcı olur. Daha fazla detaylı bilgi için laravel dökümanından yararlanabilirsiniz.
Tüm Laravel Derslerimiz için tıklayınız.
Mobilhanem.com üzerinden yayınladığım laravel eğitimlerine devam edeceğiz. Yazımız ile ilgili tüm sorularınızı yorum bölümden ulaştırabilirsiniz. Bunun dışındaki diğer sorularınız için sorucevap.mobilhanem.com sitesini kullanabilirsiniz.
Umarım sizin için yararlı olmuştur. Okuduğunuz için teşekkürler. Daha fazla kişinin okuması için paylaşmayı unutmayın…
7