Laravel ile MySQL | Eloquent ORM ve Query Builder Sorgu Yapıları
Laravel geliştirme ortamı içerisinde veritabanı sorgulamaları yaparken kullanabileceğimiz çeşitli yapılar mevcut. Bunlar, kabaca SQL sorguları yazabildiğimiz Raw SQL yapısı, arkaplanda PDO yapısını kullanan Query Builder yapısı ve Nesne Yönelimli Programlama altyapısına yakın olan, tabloları birer nesne olarak ele aldığımız Eloquent ORM yapısıdır. Bu yazımda Laravel içinde MySQL veritabanı bağlantısını gösterip basit olarak Query Builder ve Eloquent ORM yapısı sorgulamalarını örneklemeye çalıştım.
MySQL Konfigürasyonu
WAMP veya XAMPP gibi yerel web sunucu araçları ile oluşturabileceğiniz bir veritabanını Laravel projenize bağlayabilmek için proje klasörleri içerisinde ortam değişkenleri bilgilerinin tutulduğu .env dosyasında gerekli düzenlemeleri yapıyoruz.
Burada veritabanı ismi , kullanıcı adı ve şifre gibi alanları doldurduktan sonra tablolarımızda sorgulama işlemlerine başlayabiliriz.
Query Builder
Query Builder yapısı ile sorgulamalarda Laravel Illuminate\Support\Facades\DB sınıfını kullanmakta. Örneğin kullanicilar isimli bir tablomuz olduğunu ve içindeki tüm verileri çekmek istediğimizi düşünelim. Şöyle bir kod işimizi görecektir:
get() metodu ile çekilen veriler birer Illuminate\Support\Collection nesnesi olarak geriye dönmektedir. Dönen verileri bir değişkene atadıktan sonra kullanmak istediğimiz sayfaya compact() metodu ile gönderebiliriz.
Şimdi de koşullu bir örneğe göz atalım:
Query Builder ile şartlı sorgulamalar yaparken koşul ifadeleri için kullandığımız where() komutlarını bu şekilde uç uca eklemek suretiyle kullanıp istediğimiz verileri çekmekte kullanabiliriz. Burada yaşı 25 ve üzeri olan veya ismi S ile başlayan kayıtlar veritabanından çekilecektir.
Peki ilişkili tablolardan veri çekmek istersem, şöyle buyuralım:
İlişkili tablolar için Query Builder yapısı birçok metot içermekle beraber bu örnekte bir inner join sorgusu yapmaya çalıştım. Tablo ismi belirtildikten sonra yazılan ilişkide ilişkili tabloların ilgili kolonları ve ilişki operatörü belirtilir ve ardından istenen kolonlar select() komutu ile belirtildikten sonra get() ile istenen kayıtlar veritabanından çekilebilir. Hepsi bu :).
Eloquent ORM
Laravel’in en güçlü özelliklerinden biri olan Eloquent ORM yapısında veritabanındaki her bir tablo birer model olarak temsil edilir ve sorgulama işlemlerinde bu model yapıları bizler için oldukça kolaylık sağlar. Her bir model sınıfı Laravel’in Illuminate\Database\Eloquent\Model sınıfından kalıtım almalıdır. Örnek bir model tanımını inceleyelim:
Model sınıfından kalıtım alan UrunDetay isimli bu model sınıfımız içerisinde bazı özel değişkenler bulunmakta. Örneğin $table değişkeni bu model dosyasının veritabanında hangi tabloya ait olduğunun belirtilmesi için doldurulması gereken bir değişkendir. Bunun dışında CREATED_AT ve UPDATED_AT kolonlarına eğer ihtiyaç duymuyorsak $timestamps alanını false olarak doldurmamız gerekmekte. Bazı kolonların doldurulabilir veya doldurulamaz olduğunu belirtmek için de $guarded veya $fillable değişkenlerini kullanıyoruz. İlişkili sorgular kısmında urun() isimli metodun neden bu model içinde yer aldığından bahsedeceğim.
Şimdi de bir model sınıfı kullanarak verilerin nasıl çekildiğini görelim.
Bu kod bloğunda, Urun isimli model sınıfı kullanılarak şartlı bir sorgulama işlemi yapılmış. Ardından gelen veri ikişerli olarak sayfalanmış ve arama isimli bir view dosyasına gönderilmiş. Veritabanında urun ve urun_detay isimli tabloları temsil eden Urun ve UrunDetay model tanımlamaları arasında 1–1 veritabanı ilişki yapısı olduğunu tahmin etmişsinizdir. Peki çekilen bir ürün bilgisinden o ürünün detayına ulaşmak için ne yapmalıyız?
Bunun için Urun model tanımı içerisinde UrunDetay modeli ile hasOne() ilişkisi içeren bir metot yazmamız yeterli olacaktır. Aynı şekilde bir ürün detayı bilgisinden de ürün bilgisine erişmek istiyorsak UrunDetay modeli içerisine belongsTo() ilişki metodu ile bir fonksiyon yazabiliriz. Bu şekilde olan bir ilişkide bir ürün bilgisi üzerinden ürün detayına erişmek ise çok kolay.
Tablonun ikinci <td> kolonuna dikkat ederseniz döngü içerisinden gelen $urun değişkeni ile urun_detay tablosundaki bir veriye yazılan yardımcı metot üzerinden kolayca erişebilmekteyiz. Ne join var ne de select :).
Bu yazımda Laravel içinde Query Builder ve Eloquent ORM yapılarını tanıtmaya çalıştım. Kusur ve hatalar affola. Daha fazla örnek ve kullanım için Laravel dökümantasyonlarını inceleyebilirsiniz :).