Laravel Migration
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 ?
- 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.
- 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.
- İ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 adetreferee
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 ismimizadd_referee_column_on_games_table
olmalıdır.
Tips and tricks
- 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');
});
});