Laravel Migration Yapısı - Hızlı Tablo Oluşturma Ve Artisan Komutları

21.12.2019

355 Okunma

0 Favori

0 Yorum

Günümüzde yazılım dilleri içerisinde hız elde etme ve standartlaşma çabalarının doğrultusunda Framework kullanımı bir hayli yükselmeye başladı. Laravel’de PHP için 2019 yılı itibari ile en çok tercih edilen Framework’tür. Kendi içerisinde pek çok Framework’ün özellikle Symfony’nin bazı parçaları yer almaktadır. Buna ek olarak bir çok kütüphaneyi de kendi bünyesinde dahil eden Laravel geliştiriciler için gerekli bir çok yapılandırmayı da kendisine entegre etmiş durumdadır. Bu noktada daha az özelliğe ihtiyacınız var ise yada daha stabil ve performanslı bir yapıya ihtiyacınız var ise Laravel’in küçük sürümü ya da Lite sürümü diyebileceğimiz Lumen’i kullanabilirsiniz. Laravel ile alakalı bunca bilgiyi verdikten sonra konumuza dönecek olursak bahsetmiş olduğumuz standartlaşma işlemlerinden belki de en güzeli Migration’lardır.  Veritabanı yapınızı kolaylıkla oluşturmanızı sağlayan bu sistem ile hiçbir veritabanı koduna ihtiyaç duymadan bütün yapınızı kurabilirsiniz. Pek çok özelliği basit Class methodları ile çözebilirken ilişkisel bağlantılarınızı hızlı bir şekilde inşa edebiliyorsunuz. Ayrıca Migrationlar sayesinde ekip çalışmalarında oluşabilecek veritabanı değişikliklerinden oluşan sorunlarda da büyük rahatlık sağlıyorsunuz. 

Paket yazılımlar geliştiriyorsanız Laravel içerisinde entegre Artisan yapısı ile Migration’larınızı kolaylıkla yapılandırabiliyor ve “aktar ve kur” mantığını birkaç komut yardımı ile hızlıca sağlıyorsunuz. Bu kadar açıklamanın yeterli olacağını düşünerek aklınıza takılan kısımları da kod örnekleri ile çözelim. Bu yazı Laravel 5-6 sürümleri arasında test edilmiştir. Eski sürümler için değişiklikler mevcut olabilir.

Migration Oluşturma

Bu işlem için birçok yol vardır. İşin en doğru ve kısa yolunu gösterecek olursak Artisan kullanacağız. Yeni bir Migration için oluşturmak için “php artisan make:migration create_example_table” komutunu kullanacağız. Bu komut sayesinde yeni bir Class “ Migration “ sınıfından extend edilerek otomatik olarak “ database > migrations “ klasörü altında oluşturulacaktır. Oluşan dosyamızın içeriği şu şekildedir:

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateExampleTable extends Migration
{
    public function up()
    {
        Schema::create('example', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::drop('example');
    }
}

Burada dikkatimizi çeken ilk şey elbette “up” ve “down” methodları olacaktır. Bu methodlar isimlerinden çıkarım yapılacağı gibi Migration’ımızın tetikleme eylemlerine oluşturma veya yok etme işlemlerini ifade etmektedir.

Veritabanı işlemlerinde sırtımızdaki büyük yükü alan Schema sınıfının yardımı ile tablomuzu oluşturmak için “create” methoduna başvuruyoruz. Methodun ilk parameteresi tablomuzun adı olup bir diğer parametresi ile tablomuzda ki “column” ları tanımlıyoruz. Burada varsayılan olarak “$table” şeklinde tanımlanmış değişkenimize verdiğimiz her değer için yeni bir column oluşmaktadır. Varsayılan olarak karşımıza çıkan “ $table->incerements(‘id’) “ tanımlaması ile tablomuza bir artan düzende “primary key” tanımlamış oluyoruz. Bir diğer tanımlama olan “ $table->timestampt()” ile de Laravel’in klasik tablo yapısında yer alan “created_at” ve “updated_at” columnları tablomuza dahil oluyor.

Elimizdeki verileri değerlendikten sonra hadi gelin yeni columnlar oluşturalım. Tabi ki bu işlemi gerçekleştirmek için öncelikle veritabanında karşımıza çıkan tiplerin karşılığını bilmemiz gerekiyor. Kısaca sık kullandıklarımızı yazacak olursak;

  • Varchar tipi için “string()
  • Text tipi için “text()
  • Int tipi için “ integer()
  • Float tipi için “float()
  • Double tipi için “double()
  • Decimal tipi için “decimal()
  • Datetime için “datetime()
  • Char için “char()
  • Büyük yazı alanları için “longText()
  • Büyük sayılar için “bigInteger()
  • Json veriler için “json()
  • Boolean değerler için “boolean()

Methodlarını kullanarak alanlar oluşturuyoruz. Bir çoğunun ismi benzer olsa da kendi içinde pek çok dallandırma yapılmış ve bir çok tipi desteklenmesi sağlanmıştır. Buna ek olarak Laravel’in kendine ait “timestampt” gibi bir çok tanımlaması da mevcuttur. Bunları Laravel dökümanları içerisinde bulabilirsiniz. Tanımlamalarımızı kısmi olsa öğrendiğimize göre birkaç örnek verelim.

  • $table->primary(“id”)
  • $table->string(“name”)
  • $table->integer(“year”)
  • $table->boolean(“status”)
  • $table->decimal(“money”)
  • $table->datetime(“birthday”)

Elbette tablolarımızı oluştururken pek çok sınırlandırma işlemleri uyguluyoruz. Kimisi için karakter sınırlandırması kimisi için boş geçilebilir durumları tanımlanmak istenebiliyor. Bu durumda Schema sınıfımızın bir diğer methodlarına başvuruyor olacağız.

Karakter sınırlandırma işlemleri genellikle tip tanımlamaları ile birlikte yapılır. Bir örnek verecek olursak 100 karakter uzunluğunu aşamayacak bir yazı alanı oluşturacaksak “string(‘name’,100)” tanımlamasını yapıyoruz. Buna benzer şekilde yazı alanları içinde benzer bir kullanıma başvurarak “integer(10)” şeklinde tanımlama yapıyoruz. Diğer özellikleri hızlı bir şekilde listeleyecek olursak;

  • Otomatik artırılabilir alanlar için  “integer(‘count’)->autoIncrement()
  • Boş geçilebilir alanlar için “string(‘desc’)->nullable()
  • Varsayılan değerler için “string(‘img’)->default(‘defaultimg.png’)
  • Benzersiz değerler için “string(‘email’)->unique()
  • Özel charset tanımlamak için “string(‘desc’)->charset(‘utf-8’)
  • Özel collation tanımlamak için “string(‘desc’)->collation(‘utf8_turkish_ci’)

Ayrıca tablomuzun genel özelliklerini değiştirmek için şu tanımları da kullanabiliriz;

  • Charset tanımlamak için “$table->charset(‘utf8’)
  • Collaction tanımlamak için “$table->collaction(‘utf8_turkish_ci’)
  • Mysql tipi değiştirmek için “$table->engine(‘InnoDB’)

Gerekli tanımlama bilgilerinin sık kullanılan bir kısmından bahsettikten sonra tablomuzu oluşturmak için yapmamız gerek adımlara geçiyoruz. Öncelikle hatasız bir işlem yapmak için ve Migration’larınızın düzgün çalışması için “.env” dosyası içerisinden veritabanı bağlantınızı oluşturmanızı tavsiye ederim.

Oluşturduğunuz Migration’larımızı veritabanına yansıtmak için yapmamız gereken tek işlem “php artisan migrate” komutunu çalıştırmak olacaktır. Bu işlem sonucunda tek tek tablolarınız oluşacak ve veritabanınıza migrations adında bir tablo eklenerek işlenen migrationların listesi buraya eklenecektir.

İşlemlerinizde yaşadığınız sorunlarda “php artisan migrate:reset” komutu ile veritabanınızı sıfırlayabilirsiniz. Burada verilerinizin kaybolacağını önemle belirtmem gerekli. Geniş bir işlem yapmak istemiyorsanız son değişikliği geri almak için “php artisan migrate:rollback“ komutunu, birden fazla işlemi geri almak için “php artisan migrate:rollback –step=3” komutunu kullanabilirsiniz.

Veritabanını baştan oluşturmak için “php artisan migrate:refresh” veya son birkaç değişikliği yeniden oluşturmak için “php artisan migrate:refresh –step=3“ komutlarını kullanabilirsiniz.

Sık sık ihtiyaç duyduğum bilgileri burada hem kendim hem sizler için buraya not aldım. Tablo silme, yeniden adlandırma, dinamik connection açıp tablo oluşturma, mysql tipi tanımlama gibi pek çok işlemi yine Migration’lar yardımı ile yapabiliyorsunuz. Fakat ben her projede ihtiyaç duymadığım bunlara detaylı girmek istemedim. Laravel Dökümantasyonlarında bunlar için örnekler yer almaktadır.

Yazımızın sonunda sıklıkla karşılaştığım bir sorunun çözümünü de sizlere sunayım. Migration’larda tanımlanan değerler için Laravel’in varsayılan şema boyutları yetersiz kalabiliyor. Bu durumun çözümü oldukça basit “AppServiceProvider.php” dosyamızı buluyoruz. Dosyamızın içerisinde yer alan “boot()” methodu içerisine  “Schema::defaultStringLength(191);” tanımlamasını yapıyoruz. Kodumuz şu şekilde ise sorunumuz çözülmüştür.

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

 

Yorum Yap

Mail adresiniz sizinle iletişime geçebilmek amacıyla istenmektedir. Herkese açık bir platformda yayınlanmayacaktır.