Gereksinimler ve Ön Hazırlık
Laravel ile veritabanı işlemlerine başlamadan önce bilgisayarınızda PHP 8.2+ sürümünün ve Composer paket yöneticisinin yüklü olması gerekir. Ayrıca, projenizin kök dizininde bulunan .env dosyasının veritabanı bağlantı bilgilerinizle doğru yapılandırıldığından emin olmalısınız.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=proje_adi
DB_USERNAME=root
DB_PASSWORD=
Yukarıdaki yapılandırma, Laravel'in veritabanı ile konuşabilmesi için gereken temel köprüdür. Eğer veritabanı bağlantınız hatalıysa, migration komutları çalışmayacaktır.
Migration Dosyası Oluşturma Adımları
Laravel'de yeni bir tablo oluşturmak için Artisan komut satırı aracını kullanırız. make:migration komutu, veritabanı şemanızı tanımlayacağınız bir PHP sınıfı üretir. Terminalinize şu komutu yazarak bir "ürünler" tablosu oluşturalım:
php artisan make:migration create_products_table
Bu komut, database/migrations dizini altında zaman damgalı bir dosya oluşturur. Bu dosya, veritabanı yapısını tanımlayacağınız up ve değişiklikleri geri alacağınız down metodlarını içerir.
Veritabanı Şemasını Tanımlama
Oluşturduğunuz migration dosyasını açtığınızda, Schema::create metodunu göreceksiniz. Burada tablonuzun sütunlarını tanımlayabilirsiniz. Örneğin, bir ürün tablosu için isim, fiyat ve stok bilgisi ekleyelim:
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id(); // Otomatik artan ID
$table->string('name'); // Ürün ismi
$table->decimal('price', 8, 2); // Fiyat alanı
$table->integer('stock')->default(0); // Stok adedi
$table->timestamps(); // created_at ve updated_at
});
}
Burada kullanılan $table->id() ve $table->timestamps() metodları, Laravel standartlarına göre gerekli olan temel alanları otomatik olarak oluşturur. Bu, veritabanı yönetimini standartlaştırır.
Migration İşlemini Çalıştırma
Tanımladığınız şemayı veritabanına işlemek için migrate komutunu kullanmalısınız. Bu komut, henüz çalıştırılmamış tüm migration dosyalarını sırasıyla veritabanına uygular.
php artisan migrate
Bu komutu çalıştırdığınızda, Laravel veritabanınızda migrations adında bir tablo oluşturur ve hangi dosyaların çalıştırıldığını burada takip eder. Bu sayede aynı migration dosyası ikinci kez çalıştırılmaz.
Mevcut Tabloları Güncelleme
Proje ilerledikçe mevcut tablolara yeni sütunlar eklemeniz gerekebilir. Bunun için tabloyu silip tekrar oluşturmak yerine, yeni bir migration dosyası oluşturarak table metodunu kullanmalısınız:
php artisan make:migration add_description_to_products_table --table=products
Oluşan dosyada Schema::table metodunu kullanarak değişiklik yapın:
public function up(): void
{
Schema::table('products', function (Blueprint $table) {
$table->text('description')->nullable();
});
}
Bu yöntem, veritabanındaki mevcut verilerinizi kaybetmeden şemanızı güncellemenizi sağlar.
Migration İşlemlerini Geri Alma
Hatalı bir migration işlemi yaptığınızda veya geliştirme aşamasında değişiklikleri geri almak istediğinizde rollback komutu hayat kurtarıcıdır. Bu komut, en son çalıştırılan migration grubunu geri alır.
php artisan migrate:rollback
Eğer tüm veritabanını sıfırlayıp en baştan oluşturmak isterseniz migrate:fresh komutunu kullanabilirsiniz. Dikkat: Bu komut tüm tabloları siler ve verilerinizi kalıcı olarak yok eder.
Güvenlik Uyarısı: Üretim (production) ortamında migrate:fresh komutunu asla kullanmayın. Veritabanı şemalarınızı güncellerken her zaman önce yerel geliştirme ortamınızda test edin ve veritabanı yedeğinizi almayı ihmal etmeyin.
Migration Yöntemleri Karşılaştırması
| Yöntem | Kullanım Amacı | Avantajı |
|---|---|---|
| migrate | Yeni değişiklikleri uygular | Güvenli ve takip edilebilir |
| migrate:rollback | Son işlemi geri alır | Hata düzeltme kolaylığı |
| migrate:fresh | Tüm tabloları silip yeniden oluşturur | Temiz bir başlangıç sağlar |
| migrate:status | Migration durumunu gösterir | Hangi dosyanın çalıştığını görme |
Sıkça Sorulan Sorular
Migration dosyasında hata yaparsam ne olur?
Eğer migration henüz çalıştırılmadıysa dosyayı doğrudan düzeltebilirsiniz. Eğer çalıştırıldıysa, rollback yapıp dosyayı güncelledikten sonra tekrar migrate komutunu çalıştırmanız gerekir.
Veritabanı sütun türlerini nasıl belirlerim?
Laravel'in resmi dokümantasyonunda bulunan "Migration" bölümünde string, integer, boolean, json gibi onlarca farklı sütun türü mevcuttur. İhtiyacınıza en uygun olanı seçmelisiniz.
Migration dosyalarını neden kullanmalıyız?
Veritabanı yapınızı bir kod dosyası olarak saklamak, farklı ortamlarda (sunucu, yerel bilgisayar, takım arkadaşı) aynı veritabanı yapısını saniyeler içinde kurmanızı sağlar.
Migration dosyasına veri ekleyebilir miyim?
Migration dosyaları sadece şema (tablo yapısı) içindir. Tablolara varsayılan verileri eklemek için "Seeder" adı verilen ayrı bir yapı kullanılır.
Foreign Key (Yabancı Anahtar) nasıl eklenir?
$table->foreignId('user_id')->constrained(); komutu ile tablolar arasında ilişki kurabilir ve veri bütünlüğünü sağlayabilirsiniz.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Veritabanı işlemleri sırasında oluşabilecek veri kayıplarından kullanıcı sorumludur. Kritik veritabanı işlemlerinden önce mutlaka yedekleme yapınız.
Migration İşlemlerinde İleri Düzey Hata Ayıklama ve İpuçları
Büyük ölçekli projelerde migration dosyaları karmaşıklaşabilir. Özellikle veritabanı şemasında köklü değişiklikler yaparken karşılaşılan hataları yönetmek için Laravel'in sunduğu bazı gelişmiş teknikleri bilmek, geliştirme sürecinizi hızlandıracaktır.
Migration Dosyalarını İzole Etme
Bazen tüm migration dosyalarını çalıştırmak yerine, sadece belirli bir dosyayı çalıştırmak isteyebilirsiniz. Bu, özellikle hatalı bir migration dosyasını düzeltirken zaman kazandırır. Aşağıdaki komut ile sadece hedef dosyanızı çalıştırabilirsiniz:
php artisan migrate --path=/database/migrations/2023_10_27_000000_create_users_table.php
Migration Durumunu Kontrol Etme
Projenizdeki hangi migration dosyalarının çalıştırıldığını, hangilerinin beklediğini görmek için migrate:status komutunu kullanın. Bu komut, veritabanı ile kod tabanınız arasındaki senkronizasyon sorunlarını tespit etmenize yardımcı olur.
php artisan migrate:status
Canlı Ortamda (Deployment) Migration Yönetimi
Uygulamanızı canlıya (production) alırken veritabanı değişikliklerinin güvenli bir şekilde uygulanması kritik öneme sahiptir. Yanlışlıkla veritabanını sıfırlamamak veya veri kaybına yol açmamak için dikkat etmeniz gerekenler şunlardır:
- --force parametresi: Laravel, canlı ortamda tehlikeli olabilecek komutları (örneğin
migrate:fresh) çalıştırmanıza izin vermez. Eğer gerçekten çalıştırmanız gerekiyorsa--forcebayrağını eklemelisiniz. - İşlem (Transaction) Kullanımı: Laravel, migration dosyalarını varsayılan olarak bir veritabanı işlemi (transaction) içerisinde çalıştırır. Eğer bir adım başarısız olursa, veritabanı otomatik olarak eski haline döner. Ancak, bazı veritabanı sistemleri (örneğin MySQL'de
ALTER TABLEgibi) işlemleri desteklemez. Bu durumlarda migration dosyanızda$this->withoutTransaction = true;özelliğini kullanarak işlemi devre dışı bırakabilirsiniz.
public function up()
{
// Bazı veritabanı sistemlerinde transaction desteklenmez
$this->withoutTransaction = true;
Schema::table('orders', function (Blueprint $table) {
$table->string('tracking_number')->nullable();
});
}
Performans İpuçları
Çok sayıda sütun içeren büyük tablolarda migration işlemleri uzun sürebilir. Bu gibi durumlarda veritabanı kilitlenmelerini önlemek için şu yöntemleri izleyin:
| Yöntem | Avantajı |
|---|---|
| Index Ekleme | Sorgu performansını artırır ancak migration süresini uzatabilir. |
| Batch Migration | Migration dosyalarını küçük parçalara bölerek hata riskini azaltır. |
Son olarak, veritabanı şemasını güncellerken mevcut verilerin bozulmaması için nullable() veya default() değerlerini doğru yapılandırdığınızdan emin olun. Aksi takdirde, var olan satırlar yeni eklenen sütunlar nedeniyle Integrity Constraint Violation hatası verebilir.
Sonuç
Laravel ile veritabanı migration işlemleri, projenizin ölçeklenebilirliği ve sürdürülebilirliği için vazgeçilmezdir. Bu rehberde öğrendiğiniz make:migration, migrate ve rollback komutları, veritabanı yönetimi sürecinizin temel taşlarıdır. Bir sonraki adım olarak, veritabanı tablolarınıza örnek veriler eklemek için Laravel Seeder kullanımını araştırmanızı öneririm. Kodunuzu temiz tutun ve veritabanı değişikliklerinizi her zaman versiyon kontrol sisteminizde (Git) saklayın.


Yorumlar (0)
Yorum Yaz