Laravel Migration

Taha Çalışkan
Moneo
3 min readFeb 27, 2024

--

Selamlar, bu yazımda sizlere Laravel de migration yapısını, basit ve örnekli şekilde anlatacağım.

Laravel Migration Nedir?

Laravel Migration, Laravel de kod aracalığıyla veritabanınızda bir tablo oluşturmanıza ve bu tablolarınızı düzenlemenize olanak sağlayan yapıdır.Laravel geliştiricilerin veritabanı değişikliklerini yönetmelerine yardımcı olan bir özelliktir. SQL ifadelerini manuel olarak yazmaya gerek kalmadan sütun, tablo veya dizin ekleme veya kaldırma gibi veritabanı değişikliklerini işlemek için kullanılan yöntemdir.

Laravel Migration Nasıl Kullanılır ?

Migration dosyaları 2 adet fonksiyondan oluşmaktadır. Bu fonksiyonların ilki “up” fonksiyonudur. Bu fonksiyon migration dosyası tetiklendiğinde çalışıp içinde Schema classının yönlendirmesiyle verilen oluşturma ya da güncelleme işlemlerini gerçekleştiren fonksiyondur. Diğer fonksiyonumuz ise “down” fonksiyonudur. Bu fonksiyon ise çalıştırdığımız migrationu geri almak istediğimizde çalışacak fonksiyondur. Bir örnek vermek gerekirse bir tabloya sütun ekledik fakat yanlış bir güncellemeye sebep olduk. Bunun için down fonksiyonu içinde tam tersi işlemleri yapıp çalıştırabiliriz. Fakat prod database’lerde bu işlemler sakıncalı olacağı için bu durumları nasıl yönetmemiz gerektiğini makalenin ilerleyen kısımlarında anlatacağım.Şimdi kısaca migration dosyalarının içeriğinden bahsedeyim. Öncelikle migration dosyaları nasıl oluşturulur ?

Adım 1: Migration Oluşturma

php artisan make:migration create_teams_table

Bu komut, database/migrations klasörüne aşağıdaki migration dosyasını ekler. Aşağıdaki ekran görüntüsünde olduğu gibi id ve timestamps sütunları default olarak dosya oluşturulurken gelmektedir.

Peki oluşturduğumuz bu dosyayı nasıl düzenleyeceğiz ?

Adım 2: Migration Dosyasını Düzenleme

Oluşturulan migration dosyasını düzenleyerek, veritabanında yapmak istediğiniz değişiklikleri tanımlayabilirsiniz.Örnek olarak yukarıda oluşturduğumuz teams tablosuna bazı sütunları ekleyelim.

Burada tablo yeni oluşacağı için Schema classının create fonksiyonu kullanıyoruz. Yukarıda olduğu gibi sütunumuzun hangi değerde veriler barındıracağını belirtip daha sonra ismini belirtiyoruz. İlişkisel sütunlar kullanmak istediğimizde foreignId şeklinde belirterek ve sonuna constrained ekleyerek migration çalışırken otomatik olarak bu sütunun coachs tablosunda ki id ye bakacağını belirtmiş oluyoruz. Aynı şekilde nullable olmasını istediğimiz sütunlarıda nullable()fonksiyonuyla belirtebiliyoruz.

Düzenlediğimiz dosyayı nasıl çalıştırabiliriz ?

Adım 3: Migration’ı Çalıştırma

Migration dosyalarımızı çalıştırmadan önce php artisan migrate:status komutuyla kontrol edebiliriz. Bu komutu çalıştırdığımda aşağıda ki gibi bir çıktı ile karşılaşacağız. Burada daha önce çalıştırdığımız migration dosyalarımız ve bekleyen migration dosyalarımızı görmekteyiz.

Daha sonrasında ise bekleyen migrationlarımızı çalıştırmak için aşağıdaki komutu kullanabiliriz.

php artisan migrate

Bu komut, tüm bekleyen migration’ları sırayla çalıştırır ve veritabanınızı günceller. Eğer bu komutu sonuna :fresh ekleyerek çalıştırırsanız tüm veritabanınızı sıfırdan migrate etmenizi sağlar.

Laravel Migration Kullanırken Dikkat Edilmesi Gereken Noktalar Nelerdir ?

  1. Eski migration dosyalarını güncellemek: Migration dosyaları bir kere çalışmak üzerine tasarlanmıştır. Çalışan bir migration dosyası tekrardan düzenlenmemeli. Bunun yerine düzenlemek veya eklenmek istenen alan yeni bir migration dosyası açılarak Schema classının table fonksiyonu ile mevcut tablo belirtilip gerekli işlemler yapılmalıdır.
  2. Down Metodu: Her migration dosyasında bir down metodu olmalıdır. Bu metod, bir migration geri alındığında yapılacak işlemleri tanımlar. Fakat production database’lerde geri alma işlemi uygulanmaz. Bunun yerine yeni bir migration açarak düzenlemek istediğimiz tabloyu burada düzenleyerek tekrardan çalıştırarak migration yapısını ileri yönde kullanmamız gerekir.
  3. İsimlendirme: İsimlendirmeler, bir migration dosyasının ne yaptığını açık bir şekilde belli etmelidir. Çünkü migration yapısında çok fazla dosyayla çalışma ihtimaliniz yüksek olacağından bu belirti dosyalar arasında rahat ayrıştırma sağlayacaktır. Örneğin mevcut bir games tablomuz olsun. Ve biz bu tabloya bir adet referee kolonu eklemek isteyelim. Oluşturacağımız dosyanın adı yukarıda bahsettiğimiz gibi yapılan işlemi açıkça belirtmelidir. Yani dosya ismimiz add_referee_column_on_games_table olmalıdır.

Tips and tricks

  1. Model yaratırken “-m” komutuyla otomatik olarak migrationıda yaratabilirsiniz.
php artisan make:model Game -m

2. Tablo/Sütun varlığını şu şekilde kontrol edebilirsiniz:

if (Schema::hasTable('games')) {
// games tablosu mevcut mu kontrolü yapar
}

if (Schema::hasColumn('games', 'rank')) {
// games tablosunda rank kolonu var mı kontrolü yapar.
}

3. Tablo güncellerken grup olarak eklemek istediğiniz kolonları aşağıdaki gibi ekleyebilirsiniz:

Schema::table('games', function (Blueprint $table) {
$table->after('rank', function ($table) {
$table->string('last_match_score');
$table->string('last_match_team_id');
$table->string('last_match_city_id');
});
});

--

--