Selam,
Bugün Laravel’de temel veri tabanı işlemlerini öğreneceğim.
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.
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.
Ş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;
Ş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.
DB::update("UPDATE users SET meslek = ? WHERE isim = ?", array("Doctor", "Lisa"));
“Lisa” isimli kişinin mesleğini “Doctor” olarak güncelledik.
DB::delete("DELETE FROM users WHERE id = ?", array("12"));
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.
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.
İ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();
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
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") );
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.
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.
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:
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.
Celery ile alakalı "best practice"leri ve faydalı araçları bir araya getiren güzel bir checklist'e denk…
Diziler en temel ve sık kullandığımız araçlardan... Kod yazarken işimizi kolaylaştıracak, daha temiz kod yazmamızı…
listve tuple bilginizi test etmek ister misiniz? realpython.com da keşfettiğim ve Türkçe'ye çevirdiğim mini teste…
Rehberlik sağlaması ve bilgi tazelemesi açısından faydalı olduğunu düşündüğüm bir Toptal blog paylaşımınıTürkçe'ye çevirdim.Devamını okuyunBilmeniz…
Angular componentlerine console üzerinden hızlıca erişmek için kullanılan bir teknik. Unutmamak için kendime not düşüyorum.Devamını…
Geçtiğimiz günlerde keşfettiğim ve oldukça da hoşuma giden repoyu paylaşmak istiyorum: lydiahallie/javascript-questions Genel olarak temel…