Selam,
Bugün Laravel’de temel veri tabanı işlemlerini öğreneceğim.
- Veri tabanına bağlanma,
- Temel SQL sorguları,
- QueryBuilder
Pek tabii ki veri tabanıyla işlemler yapmamız için bir veri tabanına ihtiyacımız var. phpmyadmin üzerinden basit bir veri tabanı oluşturarak başlıyorum. Yeri gelmişken faydalı bir link paylaşmak istiyorum: mockaroo.com. Mockaroo sayesinde rastgele veriler oluşturup veri tabanınıza yükleyebilirsiniz.
“test
” isimli bir veri tabanı ve “users
” tablosu oluşturdum. Tablomda id
, isim
ve meslek
sütunları mevcut. Tabloyu indirmek isterseniz buraya link brakıyorum.
Veri Tabanına Bağlanma
app/config/database.php
dosyasını açıp connections
dizisindeki mysql'
e gerekli parametreleri girmemiz girek. Eğer farklı tipte bir veri tabanıyla çalışacaksak, veri tabanı tipimize uygun olan dizinin elemanlarını değiştirmemiz gerek.
Veri tabanına bağlantımızın başarılı olup olmadığını görmek için ufak bir kod yazalım:
routes.php
:
Route::get('/', function() { $veriTabaniAdi = DB::Connection()->getDatabaseName(); return $veriTabaniAdi. " ile bağlantı sağlandı."; });
Eğer her şey doğru çalışırsa lcoalhost
adresinde bizi “test ile bağlantı sağlandı” mesajı karşılaması gerek.
Temel SQL Sorguları
Select
Şimdi oluşturduğumuz veri tabanı üzerinde biraz sorgu yapalım. Sorgularımızı yaparken DB
classının metodlarını kullanacağız.
İlk olarak users
tablomuzdaki tüm verileri çekelim:
Route::get('/', function() { $users = DB::select("SELECT * FROM users"); var_dump($users); });
select()
tablomuzdaki verileri objeler halinde bir diziye atıyor.
users
tablosundan sadece idsi 1 olan satırı çekelim:
Route::get('/', function() { $user = DB::select("SELECT * FROM users WHERE id = 1"); var_dump($user); });
Bu arada var_dump
yerine Laravel’in dd()
metodunu da kullanabiliriz.
select()
metodu değerleri array
olarak döndürüyor. Yukarıda tek bir veri çektiğimiz için array
bizim için ideal sayılmaz. Verimizi sadece object
olarak almak daha mantıklı. Bunun için selectOne()
metodunu kullanabiliriz.
$user = DB::selectOne("SELECT * FROM users WHERE id = 1"); dd($user);
Böylece diziden kurtulup sadece object
olarak verimizi aldık.
Eğer gelen veriyi niteliklerine göre yani sütunlara göre yazdırmak istersek;
$user = DB::selectOne("SELECT * FROM users WHERE id = 2"); return $user->isim." adlı kişinin mesleği ".$user->meslek;
Insert
Şimdi tablomuza yeni bir veri eklemeyi görelim. Tahmin edebileceğiniz gibi bu sefer insert()
metodunu kullanacağız.
DB::insert("INSERT INTO users (isim, meslek) VALUES (?, ?)", array("Wladyslaw Szpilman", "Pianist"));
? kullanmamızın sebebi SQL Injectiona karşı güvenlik önlemi almak.
Update
DB::update("UPDATE users SET meslek = ? WHERE isim = ?", array("Doctor", "Lisa"));
“Lisa” isimli kişinin mesleğini “Doctor” olarak güncelledik.
Delete
DB::delete("DELETE FROM users WHERE id = ?", array("12"));
Diğer Sorgular
Yukarıda CRUD
işlemlerini gördük. Bunlarında dışında veri tabanı üzerinde sorgular çalıştırmamız gerekirse statement()
metodunu kullanmamız gerek. Mesela users
tablomuza yeni bir sütun eklemek gibi.
DB::statement("ALTER TABLE users ADD eposta VARCHAR(40)");
CRUD
sorgularını da statement()
içinde kullanabiliriz ama optimizasyon açısından ideal olanın select
sorguları için select()
, delete
için delete()
metodunu kullanmak olduğunu söylüyorlar.
Query Builder
Laravel sorgu oluşturucusu, uygulamanızı SQL enjeksiyon saldırılarına karşı korumak için
PDO
parametre bağlayıcı kullanmaktadır. Bağlayıcı olarak geçirilen yazıların temizlenmesine gerek yoktur. Temizlenmeyen yalnızca iki metod vardır, bunlargroupBy
veorderBy
‘dır. Kullanıcı girdilerini bu metodlara doğrudan geçmemelisiniz. – laravel.gen.tr
QueryBuilder
kullanmak için diğer önemli bir sebep ise, farklı veri tabanı tipleri için farklı sorgu cümleleri oluşturmamıza gerek kalmaması. Örneğin pgsql için geçerli olan bazı sorgu cümlecikleri mysql için farklı şekilde yazılması gerekebilir. QueryBuilder
ile bu farklıları düşünmemize gerek kalmadan sorgularımızı yazıp, gerisini QueryBuilder
‘a bırakabiliriz.
select sorguları
İlk olarak users
tablomuzdaki tüm verileri çekmekle başlayalım. Yani SELECT * FROM users
komutunu QueryBuilder
ile yazacağız.
$users = DB::table("users")->get(); dd($users);
QueryBuilder
ile sorgu oluştururken table()
ile başlamalıyız. Parametre olarak sorguyu yapacağımız tablonun adını veriyoruz ve get()
metodu ile tüm verileri çekiyoruz. Tabii ki sonuçlar yine bir dizi içinde bize döndürülüyor.
Belirli bir veriyi çekmek istersek; (SELECT * FROM users WHERE id =2
)
$users = DB::table("users")->where("id", 2)->get();
Tek bir veri çektiğimiz zaman selectOne()
metodunu kullanarak gelen objeleri diziye atmadan almıştık. QueryBuilder
da ise first()
metodunu kullanıyoruz.
$users = DB::table("users")->where("id", 2)->first();
QueryBuilder’ın en güzel yanlarından biri ise sihirli metodları where
koşullarıyla beraber kullanabilmemiz. Şöyle ki:
$users = DB::table("users")->whereMeslek("teacher")->first();
Böylece meslekleri “teacher” olan verilerin sadece ilkini almış olduk.
where
içinde bazı koşullar belirtmek istersek (<, > ..) şu şekilde kullanıyoruz. (SELECT * FROM users WHERE id > 10
)
$users = DB::table("users")->where("id", ">", "10")->get();
insert sorguları
DB::table("users")->insert( array("isim" => "Jimmy", "meslek" => "Developer", "eposta" => "j@d.y") );
Her zamanki gibi table()
metodu ile başlıyoruz. Daha sonra insert()
metoduna parametre olarak bir dizi gönderiyoruz. Dizinin anahtarları sütun isimlerini, değerleri ise verilerimizi temsil ediyor.
Eğer eklediğimiz kullanıcının “id” değerini almak istersek insertGetId()
metodunu kullanabiliriz.
$users = DB::table("users")->insertGetId( array("isim" => "Jimmy", "meslek" => "Developer", "eposta" => "j@d.y") );
update sorguları
update
sorgusuna geçmeden önce ufak bir hatırlatma yapmakta fayda var. uptade()
metodunu kullanmadan önce where()
metodunu kullanmayı unutmamalıyız. Eğer where()
metodu kullanılmazsa yapılan sorgu tablodaki verileri etkileyecektir. Aynı durum delete
sorguları için de geçerli.
DB::table("users")->where( array("id", "2") )->update( array("eposta" => "yeni@e.posta") );
İstersek yine sihir yapabiliriz:
DB::table("users")->whereId(2)->update( array("eposta" => "yeni@e.posta") );
delete sorguları
DB::table("users")->whereEposta("yeni@e.posta")->delete();
Bugünlük öğreneceğim konularım bu kadardı. Veri tabanı işlemleri her proje için önemli ve olmazsa olmaz. Laravel ile oluşturduğumuz projelerde, veri tabanı işlemleri için elimizden geldiğince QueryBuilder kullanmaya özen göstermeliyiz. QueryBuilder’a ait diğer fonksiyonlar için laravel.gen.tr‘yi ya da laravel.com’u ziyaret edebilirsiniz.
Sırada Ne Var?
Takip ettiğim eğitim serisinde sırada bir proje var: Fon Toplama Sitesi. Uğraşmak isteyenler için projeyi kısaca açıklıyorum.
- Projelerinizi saklamak için bir veri tabanına ihtiyacınız olacak. Veri tabanında projeler isminde bir tablo oluşturup, her projeye ait id, proje adı ve bağış miktarını tutacak alanları oluşturmanız yeterli.
- Sitenin ana sayfasında bir form olacak ve kullanıcılar bu forma projelerinin adını girip gönderecek. Eğer girilen proje mevcutsa kullanıcıya uyarı mesajı vereceğiz. Proje mevcut değilse veri tabanına ekleyebiliriz.
- Ana sayfada hali hazırda bulunan projeleri de listeleyeceğiz. Her projenin yanında ne kadar bağış topladığı yazacak. Ayrıca her projenin yanında bağış yapılabilmesi için bir alan olmalı. İsterseniz select box isterseniz input ile yapabilirsiniz; size kalmış.
- Son olarak kullanıcılar projeye bağış yaptığı zaman, projenin bağış miktarını güncelleyip yeniden listelemeliyiz.
Bu projeyi bloğumda paylaşmayacağım. Çünkü bireysel olarak üzerinde uğraşılması gereken bir proje. Böylece bu kısma kadar öğrendiklerimizi daha iyi anlayabiliriz ve pratiğe dökebiliriz. Ve kesinlikle bunu yapmanızı öneririm. Önce projeyi kendiniz yapmaya çalışın ve daha sonra eğitimin ana sayfasından eğitmenin nasıl yaptığını inceleyin. Bu çok yararlı olacaktır ve şu ana kadar öğrendiklerimizle alakalı ekstra ipuçları da göreceksiniz.
Projeyi yaptıktan sonra eğitime şu konularla devam ediyorum:
- MVC
- REST
Açıkcası bunlar en çok öğrenmeyi istediğim konulardan.
Eğitimler çok temel seviyede ilerliyor ama ben çok memnunum. Eğer beni takip edenler varsa, umarım sizler de bu eğitim setinden bir şeyler öğrenmişinizdir. Büyük ihtimalle de öğrendiğinizi sanıyorum 🙂 Hatta bazıları bu bloğu bırakıp direkt videolardan eğitimi bitirmiş bile olabilir ki bence olması gereken de bu 🙂
Hatırlatma1: Laravel öğrenmek için bu linkteki eğitimi takip ediyorum ve öğrendiklerimi burada paylaşıyorum.Buraya tıklayarak eğitimin anasayfasına ulaşabilir ve kaynak kodlarını indirebilirsiniz.
Hatırlatma2: Lütfen eksik,hatalı ya da düzeltilmesi gereken bir şey farkederseniz bana bildirin.
Yorumlar