Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Web Apps
Code

Laravel Olmadan PHP Uygulamalarında Eloquent ile Illuminate Veritabanının Kullanımı

by
Difficulty:IntermediateLength:LongLanguages:

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

  1. PHP: 5.5+
  2. MYSQL
  3. 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.

Our project organization

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.

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:

Artık composer.json dosyamız şu şekilde görünmeli:

Komut satırından bu iki composer komutunu composer.json dosyamızın olduğu konumda çalıştırıyoruz:

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.

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

Cevaplar

Oylar

Kullanıcılar

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

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.

start.php dosyamız şöyle görünmeli:

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:

Ardından controller ve model' lerimiz üzerinde çalışmaya başlayabiliriz. project_folder/app/models/question.php dosyasına şunu ekliyoruz:

Sonra project_folder/app/controllers/questions.php :

Ve project_folder/app/controllers/answers.php dosyasında aynı şeyi yapıyoruz:

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.

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:

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.

Kullanıcı controller' ımız artık şu şekilde görünmeli.

Daha sonra, index.php dosyasına şu satırları ekliyoruz ve kullanıcıyı yaratmak için uygulamayı çalıştırıyoruz.

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.

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:

Ardından cevap controller' ına şu satırları ekliyoruz:

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.

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.

Ardından cevap controller' ına Upvote modelininin isim alanını dahil ediyoruz.

use Models\Upvote;

Sonra da upvote_answer fonksiyonunu oluşturuyoruz.

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.

Ardından soru controller' ında, soruyu ve cevaplarını getiren bir fonksiyon yazıyoruz.

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.

Ardından soru controller' ında bir fonksiyon oluşturup soru modelinde with işlevini kullanırız.

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.

Ardından soru controller' ında bunu elde etmek için bir fonksiyon oluşturuyoruz:

Ö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:

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:

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:

Ardından, soru controller' ında delete_question fonksiyonunu oluşturuyoruz.

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.