Başlarken;
Laravel Framework’ün dosya ve dizinlerini incelemiştik. Eğer hâlâ bu dosya ve dizinleri bilmiyorsanız ” Laravel Rehberi – Temel Dosya ve Dizin Yapısı “ makalemi inceleyebilirsiniz.
Controller yapısına da az çok hakimiz artık. Laravel Framework kullanarak temel seviye bir proje oluşturmamız için son adımlardan birisi olan Model kavramımız kaldı. Laravel Framework’de Model kavramı tek başına kullanılmaz. Yanında ek olaran sunulan ” Eloquent ORM (bir ActiveRecord uygulaması)” ile birlikte çalışır. Daha sonra ayrıntılarıyla bu Eloquent uygulamasını inceleyeceğiz.
Bu makalede Laravel Framework üzerinde Model tanımlamaya odaklanacağız. Bu makalenin amacı Laravel Framework yardımıyla “Temel Model” kavramını öğretmek ve kullanmaktır. Bu makale size yeterli gelmediyse yakın zamanda yayınlayacağım “Laravel Rehberi – Model Sistemi (İleri Seviye)” ve “Laravel Rehberi – Eloquent ORM” başlığını inceleyebilirsiniz.
Temel Gereksinimler;
- PHP OOP (Nesnesel Porgramlama)
- Çalışan bir Laravel Projesi – Laravel Rehberi – Giriş Konusunu İnceleyebilirsiniz…
- Laravel Framework üzerindeki Dosya ve Dizin Yapısı – Laravel Rehberi – Temel Dosya ve Dizin Yapısı Konusunu İnceleyebilirsiniz…
İzlenecek Yol Haritası;
- Model ve Eloquent ORM Nedir?
- Yeni bir Model nasıl oluşturulur?
- Oluşturulan Model’ler nasıl çalışır?
Model ve Eloquent ORM Nedir?
” MVC 5N1K? “ makalesinde temel olarak Model kavramına değinmiştik. Burada da üzerinden kısaca bir geçelim.
- Model: Veritabanı ilişkileri (Veri çekme, veri güncelleme, veri girişi v.s) bu katmanda gerçekleşir.
Bir de karşımıza şimdi Eloquent ORM olayı çıktı. Bu yapı temelini modellerden alır. SQL sorgusu yazmadan veritabanı ile ilişki kurmamıza yardımcı olacak diyebiliriz temelde. Deriz deriz de bu yapıya bunu demek biraz ayıp olur ama olsun. İnce detaylarına yeni bir makalede ineceğiz. (Arkada tabi ki SQL komutları çalışacak. Fakat biz SQL olarak yazmayacağız.)
Yeni Bir Model Nasıl Oluşturulur?
Model de Controller gibi iki farklı yol ile oluşturulabilir. Zor yola bir örnek verelim. Model dosyalarımızın dizini “proje_adi/app” idi. Bu dizin içerisinde yeni bir dosya oluşturup isimlendirebilirsiniz. Fakat sağlıklı bir yol olduğu pek söylenemez. Çünkü Laravel Framework her Controller için belirli “namespaces” bölümleri oluşturuyor. Bu sebeple ikinci yol olan konsol kısmını kullanacağız. (Önceki makalelerimden biraz kopyala yapıştır oluyor evet 🙂 Umarım bu durum okuyucularım olan sizleri olumsuz bir şekilde etkilemiyordur.)
Laravel Framework ile proje geliştirirlen unutmamamız gereken bir adım olmalı. El altında her zaman açık bir konsol uygulaması bulundurun. Bu uygulama CMD, Powershell, Bash gibi herhangi biri olabilir. Size kalmış. Ben rehberlerimde CMD kullanacağım. Başlayalım.
“php artisan” bize Laravel Framework tarafından sunulan tüm konsol işlemlerini çalıştırmamızı sağlar. Biz bu makalede “make:model” komutunu kullanacağız.
php artisan make:model model_adi
Örneğin => php artisan make:model Kategori
Kategori örneği üzerinden bir örnek ile Model yapısını kavramaya çalışalım. Model yapısında fark ettiyseniz Controller’daki gibi ek bir belirteç koymuyoruz. Tek dikkat edilmesi gereken Model dosya isimlerinin tekil olmasıdır. Kullanıma karşı hiçbir etkisi yoktur. Fakat kullanıcılara (yani biz yazılımcılara) etkisi çoktur 🙂
Bu komut sonrasında neler oluyor? Model dizinimizde “Kategori” adında dosya oluştuğunu göreceğiz. İçeriğinde neler var? İrdeleyelim…
namespace App;
use Illuminate\Database\Eloquent\Model;
class Kategori extends Model
{
//
}
Laravel bir Model oluştururken dikkat ettiği ilk nokta “namespace” alanıdır. Fark ettiyseniz bu sınıfa verilen namespace dosya yolumuzu içeriyor. Evet! Zaten olay da bu. Laravel bir Model dosyasına erişmek için dosya yolunu içeren bu namespace alanını kullanıyor.
“use…” ile yine bir şeylerin bu sınıfta kullanılacağını görüyoruz. “Database\Eloquent\Model” kavramını görünce bunun “Eloquent ORM” yapısını olduğunu anlıyoruz.
Devamında ise “Kategori” adında bir sınıfın “Model” sınıfından türediğini görebilirsiniz. Bir Model tanımladık fakat eksikler var. Bu Model yapısı daha hangi veritabanına bağlı, hangi sütünları içeriyor, primary key’i ne bunu bile bilmiyor. Tanımlayacağız…
Oluşturulan Model’ler Nasıl Çalışır?
“Nasıl çalışır?” sorusunu sormadan önce “Şu an çalışacak mı?” sorusunu sormak daha doğru olur. Çünkü bir üst paragrafta dediğim gibi eksikler ile karşı karşıyayız. Öncelikle bu Model yapısını bağlayacağımız bir veritabanı oluşturmamız gerekir. Dikkat edilmesi gereken husus şudur. Eloquent ORM yapısı veri girişi/güncellemesi yaparken tablolarda “created_at” ve “updated_at” adında iki sütun ister. Bu örnek için oluşturduğum “kategoriler” tablom aşağıdaki gibidir;
Veritabanı için yapılması gereken tek bir adım kaldı. Oluşturduğumuz veritabanını projemize bağlamak. Nerede yapılıyordu bu işlem? “.env” dosyamıza erişelim. (Dosya projenizin kök dizinde bulunuyor.)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
“.env” dosyası üzerinde veritabanı bağlantısını için bu kod bloğunu düzenleyeceğiz.
DB_DATABASE=localhost
DB_USERNAME=root
DB_PASSWORD=
“DB_PASSWORD” alanı boş. Çünkü benim “localhost” tarafımda bir parola kullanmıyorum. Bu 3 tanımlama sizin kendi veritabanı bilgilerinizi içerir.
Veritabanı bağlantısı ve tablolarımız tamam. Şimdi bu tabloyu Modelimize tanıtalım. “Kategori.php” dosyamızı açalım ve şu düzenlemeleri yapalım.
class Kategori extends Model
{
protected $table = "kategoriler";
public $primaryKey = "id";
public $timestamps = true;
protected $fillable = [
"ad",
"aciklama",
];
protected $guarded = [
"id"
];
}
- “$table” değişkenimiz tablomuzun adını tutar.
- “$primaryKey” tablomuzun “AUTO_INCREMENT” sütununun adını tutar.
- “$timestamps” tablomuzda “created_at” ve “updated_at” sütunlarının olduğunu ve kullanılacağını söyler. Eğer “false” değerini alırsa tabloda “created_at” ve “updated_at” sütunlarının oluşturulmasına gerek kalmaz.
- “$fillable” tablo üzerinde düzenleme yapılacak alanları tanımlar.
- “$guarded” tablo üzerinde düzenleme yapılamayacak alanları tanımlar.
Gerekli tanımlamaları da yaptığımıza göre artık Controller üzerinde bağlantımızı sağlayabiliriz. Kendimize bir “KategoriController” oluşturalım. Bu işlem adımı için ” Laravel Rehberi – Controller Sistemi (Temel Seviye) “ makalemden destek alabilirsiniz.
Tabi ki oluşturulan bu Controller için bir rota tanımlamamız gerekiyor.
Route::get('/kategori', 'KategoriController@Index');
“Index” adında bir methodumuz bulunuyormuş. Yapacağımız işlem bu Method üzerinden tüm Kategori bilgilerini getirmek olsun. Fakat “kategoriler” tablosunda hiçbir veri bulunmuyor. Bu sebeple bir de kategori ekleme rotası tanımlayalım.
Route::get('/kategori/ekle', 'KategoriController@Ekle');
Kullanıcı tarafından veri almadan bir ekleme işlemi yapacağız burada. Herhangi bir form ya da POST işlemi bulunmayacak. Çünkü biz daha View ile Controller’a veri aktarmayı öğrenmedik. “Ekle” methodumuz şu şekilde çalışsın;
public function Ekle(){
$yeni_kategori = new Kategori;
$yeni_kategori->ad = "PHP";
$yeni_kategori->aciklama = "PHP hakkında makaleleri içerir.";
$yeni_kategori->save();
echo "Kategori Eklendi.";
}
Bu durumda biz “/kategori/ekle” adresine ulaşırsak Laravel yeni bir kategori oluşturup bunu veritabanına kaydeder. Peki ya nasıl?
- “Kategori” modelinden “$yeni_kategori” adında bir değişken oluşturur.
- “Kategori” modelinde tanımladığımız “ad” ve “aciklama” kısmını kullanarak “$yeni_kategori” değişkeninin tanımlanması yapılır.
- “save()” methodu ile oluşturulan bu “$yeni_kategori” veritabanına kaydedilir.
Artık projemizi “php artisan serve” ile çalıştırıp ” /kategori/ekle ” rotasına erişirsek çıktımız şu şekilde olacak;
Gerçekten çalıştı mı kontrol edelim. Hemen “phpMyAdmin” paneline erişiyoruz.
Şimdi de “Index” methoduna kategoriler tablsoundaki verilerin hepsini çekelim. “Kategori.php” üzerinde bir ekleme yapmamız gerekecek.
public function Index(){
$kategoriler = Kategori::all();
var_dump($kategoriler);
}
Elde ettiğimiz bir dizi varmış burada. Tabi ki “var_dump()” fonksiyonu düzgün bir çıktı vermiyor. “Index” methodumuzu düzenleyelim.
public function Index(){
$kategoriler = Kategori::all();
foreach ($kategoriler as $kategori){
echo $kategori->ad;
echo "<br>";
echo $kategori->aciklama;
echo "<hr>";
}
}
Daha güzel gözükmesi açısından yeni bir kategori ekledim. Bunu siz de yazdığımız “Ekle” methodunu kullanarak yapabilirsiniz.
Rehber Kaynakları;
Umarım ki “Laravel Rehberi – Model Sistemi (Temel Seviye)” makalesi hoşunuza gitmiştir. Keyifli ve Bol Bug’lu Günler Dilerim 🙂
Yasin Erarslan