Turkish (Türkçe) translation by Oğuz Çelikdemir (you can also view the original English article)
Illuminate, Laravel'sizde kullanılabilen, Laravel'in veritabanı motorudur. Laravel'de Eloquent ORM ile birlikte gelir. PHP uygulamalarınızı ORM' ler ile oluşturmayı istiyor ve Laravel' i kullanmamayı tercih ediyorsanız bu eğitim tam size göredir.
Bu eğitimde, bir soru-cevap uygulamasının sunucu tarafını PHP, Illuminate Veritabanı ve Eloquent ORM ile oluşturacağız.
Proje Gereksinimleri
- PHP: 5.5+
- MYSQL
- Composer
Uygulamanın Kabiliyetleri
Uygulamamız on görevi yerine getirecek. Bunlar:
- Kullanıcı ekleme.
- Soru ekleme.
- Soruya cevap ekleme.
- Cevabı oylama.
- Bir soruyu cevaplarıyla listeleme.
- Tüm soruları soran kişilerle birlikte listeleme.
- Bir soruyu cevap ve oylarıyla listeleme.
- Bir kullanıcıya ait soruların sayısını listeleme.
- Cevap güncelleme.
- Soru silme.
Öncelikle, proje dizini ve yapısını oluşturuyoruz.
Proje dizininde, app klasörünü oluşturuyoruz, sonra bu app klasörü altında iki dizin daha oluşturacağız: models ve controllers. Resimden de görüldüğü üzere, proje dizinimizin adını eloquent olarak isimlendirdik. Dilediğiniz bir isimle bunu değiştirebilirsiniz.

Ardından, proje dizinimizde app klasörü ile aynı seviyede yer alan bir index.php dosyası oluşturuyoruz.
Git kullanacağız, dolayısıyla .gitignore dosyasını oluşturuyoruz. Bu adımın isteğe bağlı olduğunu unutmayın.
Sonra, projemizin çalışması için gereken bağımlılıkları yüklüyoruz. Proje dizininde, bir composer.json dosyası oluşturup aşağıdaki kod bloğunu composer.json dosyasının içine yapıştırıyoruz.
{ “name”: “illuminate-example/eloquent”, “description”: “Implementation of Database Queries with illuminate and Eloquent”, “type”: “project”, “require”: {} }
Illuminate veritabanını yüklemek için aşağıdaki satırı composer.json dosyasına ekleyip:“illuminate/database”: “5.1.8”,
.
Hemen altına, Model ve Controller' larımız için psr-4 otomatik yükleme direktifini ekliyoruz:
“autoload”: { “psr-4”: { “Controllers\\”: “app/controllers/”, “Models\\”: “app/models/” } }
Artık composer.json dosyamız şu şekilde görünmeli:
{ “name”: “illuminate-example/eloquent”, “description”: “Implementation of Database Queries with illuminate and Eloquent”, “type”: “project”, “require”: { “illuminate/database”: “5.1.8”}, “autoload”: {“psr-4”: { “Controllers\\”: “app/controllers/”, “Models\\”: “app/models/" } } }
Komut satırından bu iki composer komutunu composer.json dosyamızın olduğu konumda çalıştırıyoruz:
composer install composer dump-autoload -o
Bu .gitignore dosyasına ekleyebileceğimiz (buda isteğe bağlı bir adımdır) bir vendor klasörü oluşturacaktır.
Şimdi de veritabanı bağlantı bilgilerini içeren bir yapılandırma dosyası ekleyelim.
Proje dizinimizde, config.php isminde bir dosya oluşturup içine veritabanı bilgilerimizi girelim.Kod bloğundaki bağlantı bilgilerini kendi bağlantı bilgileriniz ile değiştirmeyi unutmayın.
<?php defined(“DBDRIVER”)or define(‘DBDRIVER’,’mysql’); defined(“DBHOST”)or define(‘DBHOST’,’localhost’); defined(“DBNAME”)or define(‘DBNAME’,’eloquent-app’); defined(“DBUSER”)or define(‘DBUSER’,’root’); defined(“DBPASS”)or define(‘DBPASS’,’pass’);
Ardından, uygulamamızın veritabanı şemasını oluşturuyoruz.
Veritabanımızdaki tablolar için şema oluşturmadan önce, şemamıza tarih bilgilerini ekleyebildiğimize dikkatinizi çekmek isterim.
Eloquent ORM, belirli bir tablo/model üzerinde zaman işlemi yapmak istiyorsak, bizden iki zaman kolonunun varolmasını bekler. Bunlar created_at
ve updated_at
kolonlarıdır. Bir model için zaman işlemlerini etkinleştirirsek, Eloquent otomatik olarak bu alanları bir kayıt oluşturulurken veya değiştirilirken günceller.
deleted_at
adında üçüncü bir zaman kolonu da vardır. Fakat deleted_at
farklı çalışır. Eloquent, bir kaydın silinip silinmediğini belirlemek için, deleted_at
kolonunu kullanan geçici silme yeteneğine sahiptir. Bir kaydı Eloquent' in 'delete' fonksiyonu ile siler ve geçici silme yeteneğini de etkinleştirmişseniz, kolon, silme zamanı ile güncellenir.
Uygulamamızda, zaman işlemlerinden faydalanacağız, bu nedenle üç kolonuda şema oluşturma sürecinde kullanacağız.
MySQL veritabanında, aşağıdaki komutları kullanarak tabloları oluşturun:
Sorular
CREATE TABLE `questions` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `question` tinytext, `user_id` int(11) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Cevaplar
CREATE TABLE `answers` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `answer` tinytext, `user_id` int(11) DEFAULT NULL, `question_id` int(11) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Oylar
CREATE TABLE `upvotes` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `answer_id` int(11) DEFAULT NULL, `user_id` int(11) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Kullanıcılar
CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(100) DEFAULT NULL, `email` varchar(200) DEFAULT NULL, `password` varchar(200) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Aşağıdaki dizinlerde, tablolarımız için model ve controller dosyalarını oluşturarak devam edeceğiz:
- project_folder/app/models/question.php
- project_folder/app/models/answer.php
- project_folder/app/models/upvote.php
- project_folder/app/models/user.php
- project_folder/app/models/database.php
- project_folder/app/controllers/questions.php
- project_folder/app/controllers/answers.php
- project_folder/app/controllers/upvotes.php
- project_folder/app/controllers/users.php
Editörde models/database.php dosyasını açın.
Önce Capsule' ü oluşturuyoruz
<?php namespace Models; use Illuminate\Database\Capsule\Manager as Capsule; class Database { function __construct() { $capsule = new Capsule; $capsule->addConnection([ ‘driver’ => DBDRIVER, ‘host’ => DBHOST, ‘database’ => DBNAME, ‘username’ => DBUSER, ‘password’ => DBPASS, ‘charset’ => ‘utf8’, ‘collation’ => ‘utf8_unicode_ci’, ‘prefix’ => ‘’, ]); // Setup the Eloquent ORM… $capsule->bootEloquent(); } }
Yukarıdaki dosyada, yeni bir capsule nesnesi yaratıp config.php dosyasında tanımlı sabitleri kullanarak ilk değerlerini atadık, ardından Eloquent ORM' yi ayarladık.
Sonraki adım ise bir başlangıç script'i oluşturmak. Bu, uygulamamız çalışmadan önce, çalıştırılması gereken herşeyin başlatıldığı dosyadır.
project_folder/start.php konumunda bir başlangıç dosyası oluşturup dosyanın içinde Composer autoload dosyasını projeye dahil ediyoruz.
require ‘vendor/autoload.php’;
Ardından veritabanı bağlantı bilgileri için config.php dosyasını projemize dahil edip: require ‘config.php’;
Sonra veritabanı sınıfımızın bir örneğini oluşturuyoruz.
<?php use Models\Database; //Boot Database Connection new Database();
start.php dosyamız şöyle görünmeli:
<?php require ‘config.php’; require ‘vendor/autoload.php’; use Models\Database; //Initialize Illuminate Database Connection new Database(); ?>
Asıl dosyamız olduğu için start.php dosyasını index.php dosyamıza ekliyoruz.
index.php dosyamız şöyle görünmeli:
<?php require ‘start.php’; ?>
Ardından controller ve model' lerimiz üzerinde çalışmaya başlayabiliriz. project_folder/app/models/question.php dosyasına şunu ekliyoruz:
<?php namespace Models; use \Illuminate\Database\Eloquent\Model; class Question extends Model { protected $table = ‘questions’; } ?>
Sonra project_folder/app/controllers/questions.php :
<?php namespace Controllers; class Questions{ } ?>
Ve project_folder/app/controllers/answers.php dosyasında aynı şeyi yapıyoruz:
<?php namespace Controllers; class Answers{ } ?>
Görev 1: Kullanıcı Ekleme
Kullanıcı modelinde (project_folder/app/models/user.php), isim alanını, Eloquent Model' inden türetmeyi ve tablo ismi (protected $table
) ile tablodaki hangi alanların toplu kayıt ile doldurabileceğini (protected $fillable
) tanımlamak için aşağıdaki kodu ekliyoruz.
<?php namespace Models; use \Illuminate\Database\Eloquent\Model; class User extends Model { protected $table = ‘users’; protected $fillable = [‘username’,’email’,’pass’]; } ?>
Kullanıcı controller' ında (project_folder/app/controllers/user.php), her zaman olduğu gibi isim alanını ve sınıfımızı tanımlıyoruz:
<?php namespace Controllers; class Users{ } ?>
Sonra, kullanıcı controller' ında bir kullanıcı oluşurmak için, kullanıcı modeli isim alanını, use Models\User;
, dahil edip ardından kullanıcı yaratmak için gerekli olan fonksiyonu ekliyoruz.
<?php public static function create_user($username, $email, $password){ $user = User::create(['username'=>$username,'email'=>$email,'password'=>$password]); return $user; }
Kullanıcı controller' ımız artık şu şekilde görünmeli.
<?php namespace Controllers; use Models\User; class Users { public static function create_user($username, $email, $password){ $user = User::create(['username'=>$username,'email'=>$email,'password'=>$password]); return $user; } } ?>
Daha sonra, index.php dosyasına şu satırları ekliyoruz ve kullanıcıyı yaratmak için uygulamayı çalıştırıyoruz.
<?php use Controllers\Users; // Import user controller $user = Users::create_user(“user1”,”user1@example.com”,”user1_pass”);
Görev 2: Soru Ekleme
Soru eklemek için, soru controller' ına Question modeli isim alanını dahil edip:
use Models\Question;
Bir create_question fonksiyonu yazıyoruz.
<?php public static function create_question($question,$user_id){ $question = Question::create(['question'=>$question,'user_id'=>$user_id]); return $question; }
Kayıt eklemede, Eloquent' in toplu kayıt ekleme modelini kullandık fakat çalışmadan önce, bu alanların doldurulabilir olduğunu belirtmeliyiz. Çünkü Eloquent modelleri ön tanımlı olarak toplu kayıt oluşturmaya karşı korumalıdır.
Dolayısıyla, question
modeline gidip protected $fillable
özelliğini sınıfa ekliyoruz.
protected $fillable = ['question','user_id'];
Çalıştırmak için, index.php dosyasına soru controller' ını ekleyip create_question
statik fonksiyonunu çağırıyoruz.
use Controllers\Question;
Ardından soruyu ve kullanıcı numarasını parametre olarak kullanıp soruyu yaratıyoruz:
$question = Questions::create_question("Have you ever met your doppelganger?",1);
Bu sorunsuz çalışırsa bir model nesnesi döndürür.
Şimdi, veritabanına daha fazla soru eklemek için index.php dosyasını farklı kayıtlarla çalıştıralım.
Görev 3: Soruya Cevap Ekleme
Cevap modelinde, kullanıcı ve soru modellerinde uyguladığımız adımları aşağıdaki kodu ekleyerek tekrarlıyoruz:
<?php namespace Models; use \Illuminate\Database\Eloquent\Model; class Answer extends Model { protected $table = ‘answers’; protected $fillable = [‘answer’,’user_id’,’question_id’]; } ?>
Ardından cevap controller' ına şu satırları ekliyoruz:
<?php namespace Controllers; use Models\Answer; class Answers { public static function add_answer($answer,$question_id,$user_id){ $answer = Answer::create(['answer'=>$answer,'question_id'=>$question_id,'user_id'=>$user_id]);return $answer; } } ?>
Daha sonra index.php de, daha önce eklediğimiz id' si 1 olan soru için kullanıcı id' si 2 olan bir cevap ekleriz. index.php' ye cevap controller' ını eklemeyi unutmayın.
<?php use Controllers\Answers; $answers = Answers::add_answer(“This is an answer”,1,2);
Aynı yanıtı birden fazla eklemeyi önlemek için, index.php yi yeniden çalıştırmadan önce diğer yanıtları yorum satırına dönüştürün.
Görev 4: Cevabı Oylama
Bu uyguladığımız adımlarla hemen hemen aynı bir adım.
Bu yüzden aşağıdaki kod bloğunu Upvote modelinin yer aldığı project_folder/app/models/upvote.php dosyasına kopyalıyoruz.
<?php namespace Models; use \Illuminate\Database\Eloquent\Model; class Upvote extends Model { protected $table = 'upvotes'; protected $fillable = ['answer_id','user_id']; } ?>
Ardından cevap controller' ına Upvote modelininin isim alanını dahil ediyoruz.
use Models\Upvote;
Sonra da upvote_answer
fonksiyonunu oluşturuyoruz.
<?php public static function upvote_answer($answer_id,$user_id){ $upvote = Upvote::create(['answer_id'=>$answer_id,'user_id'=>$user_id]); return $upvote; }
1 numaralı cevabı oylamak için, index.php dosyasında, varolmayan bir kullanıcı numarası ile fonksiyona çağrıda bulunabiliriz.
$upvote = Answers::upvote_answer(1,14);
Görev 5: Bir Soruyu Cevaplarıyla Listeleme
Bu tür görevler için Eloquent ilişkilerini kullanabiliriz.
İlişki türleri arasında bire-bir, bire-çok, çoka-çok vs. yer alır.
Bu tür ilişkileri kullanırken, Eloquent, modellerde modelname_id biçiminde bir foreign key olduğunu varsayar. Bu görev için ilişki, bire-çok bir ilişkidir çünkü bir soru birden çok cevaba sahip olabilir.
Öncelikle bu ilişkiyi, aşağıdaki fonksiyonu soru modelimize ekleyerek tanımlıyoruz.
<?php public function answers() { return $this->hasMany('\Models\Answer'); }
Ardından soru controller' ında, soruyu ve cevaplarını getiren bir fonksiyon yazıyoruz.
<?php public static function get_questions_with_answers(){ $questions = Question::with('answers')->get()->toArray(); return $questions; }
Bu soruya karşılık gelen cevapları listeler.
index.php dosyasında, diğer fonksiyon çağrılarını yorum satırına çevirip aşağıdaki satırı çalıştırıyoruz:
$all = Questions::get_questions_with_answers();
Sonuçları görmek için $all
değişkenini var_dump
veya print_r
ile görüntüleyebiliriz.
Görev 6: Tüm Soruları Soran Kişilerle Birlikte Listeleme
Bu bire-bir bir ilişkidir çünkü bir soru bir kullanıcıya aittir, dolayısıyla bunu soru modeline ekliyoruz.
<?php public function user() { return $this->belongsTo(‘\Models\User’); }
Ardından soru controller' ında bir fonksiyon oluşturup soru modelinde with
işlevini kullanırız.
<?php public static function get_questions_with_users(){ $questions = Question::with('user')->get()->toArray(); return $questions; }
index.php dosyasında, diğer fonksiyon çağrılarını yorum satırına dönüştürüp şunu çalıştırın:
$all_with_users = Questions::get_questions_with_users();
Görev 7: Bir Soruyu Cevap ve Oylarıyla Listeleme
İlk olarak, cevaplar ile oylar arasında bir ilişki tanımlıyoruz. Bir cevap birden fazla oya sahip olabilir, dolayısıyla ilişki bire-çok tur.
Bu nedenle cevap modelimize aşağıdaki fonksiyonu ekliyoruz.
<?php public function upvotes() { return $this->hasMany('\Models\Upvote'); }
Ardından soru controller' ında bunu elde etmek için bir fonksiyon oluşturuyoruz:
<?php public static function get_question_answers_upvotes($question_id){ $questions = Question::find($question_id)->answers()->with('upvotes')->get()->toArray(); return $questions; }
Önceki adımlarda olduğu gibi, index.php deki diğer tüm fonksiyon çağrılarını yorum satırına dönüştürüp şunu çalıştırıyoruz:
$one_question = Questions::get_question_answers_upvotes(1);
$one_question
değişkenini ekrana bastırıp sonuçlarını görebiliriz.
Görev 8: Bir Kullanıcıya Ait Soruların Sayısını Listeleme
İlk olarak kullanıcı controller' ına soru modelini dahil ediyoruz:
use Models\Question;
Ardından şu fonksiyonu yazıyoruz:
<?php public static function question_count($user_id){ $count = Question::where('user_id',$user_id)->count(); return $count; }
index.php de, diğer fonksiyon çağrılarını yorum satırına dönüştürüp şu satırı ekliyoruz:
$user_question_count = Users::question_count(1);
Bu, numarası 1 olan kullanıcı tarafından eklenen soruların sayısını tamsayı olarak döndürür.
Sonuçları görmek için index.php dosyasını çalıştırabilir ve $user_question_count
değişkenini ekrana yazdırabiliriz.
Görev 9: Cevap Güncelleme
Eloquent ORM ile güncelleme kavramı oldukça basittir. Önce kaydı buluruz ardından değiştirip kaydederiz.
Şimdi, cevap controller' ına şu fonksiyonu ekliyoruz:
<?php public static function update_answer($answer_id,$new_answer){ $answer = Answer::find($answer_id); $answer->answer = $new_answer; $updated = $answer->save(); return $updated; }
index.php de, diğer tüm fonksiyon çağrılarını yorum satırına alıp numarası 1 olan cevabı şöyle güncelleriz:
$update_answer = Answers::update_answer(1,”This is an updated answer”);
Bu güncelleme başarılı olursa geriye mantıksal -true- değerini döndürür.
Görev 10: Soru Silme (Geçici Silme)
Son görevimizde, Eloquent' in SoftDelete tekniğini uygulayacağız.
İlk olarak, sınıfımıza SoftDeletes
isim alanını ekleyip ardından SoftDeletes
trait' ni kullanarak soru modeline SoftDeletes
i kullanmasını söylüyoruz.
use Illuminate\Database\Eloquent\SoftDeletes;
Sınıf deklarasyon satırının ardından şu satırı ekliyoruz:
use SoftDeletes;
Sonra modelin protected $dates
özelliğine deleted_at
satırını ekliyoruz.
protected $dates = [‘deleted_at’];
Şimdi soru modelimiz şu şekilde görünmeli:
<?php namespace Models; use \Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Question extends Model { use SoftDeletes; protected $table = 'questions'; protected $fillable = ['question','user_id']; public function answers() { return $this->hasMany('\Models\Answer'); } public function user() { return $this->belongsTo('\Models\User'); } } ?>
Ardından, soru controller' ında delete_question
fonksiyonunu oluşturuyoruz.
<?php public static function delete_question($question_id){ $question = Question::find($question_id); $deleted = $question->delete(); return $deleted; }
index.php ye şu satırı ekleyip çalıştırın:
$delete = Questions::delete_question(1);
Tebrikler! Eloquent ve Illuminate ile fonksiyonel bir sunucu taraflı uygulama inşa ettiniz. Tüm bunları gerçekleştirmek için çok fazla kod yazmak zorunda kalmadık.
Eğitime ait kodu Github üzerinde bulabilirisiniz.
Sonuç
Illuminate ayrıca, daha karmaşık veritabanı sorguları için kullanabileceğiniz Query Builder (sorgu oluşturucu) ile gelir ve kesinlikle uygulamanızda deneyip kullanmak isteyeceğiniz birşeydir.
Bağımsız Illuminate Veritabanında eksik olan tek şey, Laravel' in güzel bir özelliği olan veritabanı taşıma ve Laravel' in mikro çatısı olan Lumen' dir. İçerdikleri kullanışlı özelliklerden faydalanmak için her ikisini de kullanmayı düşünmelisiniz.
Eloquent hakkında daha fazla bilgiye Eloquent Resmi Dökümantasyon sayfasından erişebilirsiniz.
Kaynaklar
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post