{"id":31310,"date":"2025-10-08T13:33:37","date_gmt":"2025-10-08T10:33:37","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/"},"modified":"2025-10-08T13:33:37","modified_gmt":"2025-10-08T10:33:37","slug":"laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/","title":{"rendered":"Laravel Migrations K\u0131lavuzu 2025: Veritaban\u0131 Y\u00f6netiminde Uzmanla\u015f\u0131n"},"content":{"rendered":"<p>Laravel projelerinizde veritaban\u0131 \u015femas\u0131n\u0131 y\u00f6netmek karma\u015f\u0131k m\u0131 geliyor? \u00d6zellikle ekip \u00e7al\u0131\u015fmas\u0131 yaparken veya bir uygulamay\u0131 farkl\u0131 ortamlara (geli\u015ftirme, test, canl\u0131) da\u011f\u0131t\u0131rken veritaban\u0131 de\u011fi\u015fikliklerini tutarl\u0131 bir \u015fekilde y\u00f6netmek b\u00fcy\u00fck bir zorluk olabilir. \u0130\u015fte bu noktada Laravel Migrations devreye giriyor ve adeta bir kurtar\u0131c\u0131 g\u00f6revi \u00fcstleniyor. Migrations, veritaban\u0131 \u015feman\u0131z\u0131 PHP koduyla tan\u0131mlaman\u0131za ve s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda tutman\u0131za olanak tan\u0131yan bir sistemdir. Bu sayede, projenizin ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca veritaban\u0131n\u0131zdaki t\u00fcm yap\u0131sal de\u011fi\u015fiklikleri izleyebilir, uygulayabilir ve gerekti\u011finde geri alabilirsiniz. 2025 y\u0131l\u0131na girerken, modern web geli\u015ftirme pratiklerinde veritaban\u0131 y\u00f6netimi her zamankinden daha merkezi bir rol oynuyor ve Laravel Migrations, bu s\u00fcreci \u015feffaf, y\u00f6netilebilir ve hatas\u0131z hale getirmek i\u00e7in vazge\u00e7ilmez bir ara\u00e7 olarak \u00f6ne \u00e7\u0131k\u0131yor. Geli\u015ftiricilerin \u00e7o\u011fu zaman g\u00f6z ard\u0131 etti\u011fi ancak projenin stabilitesi ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi i\u00e7in kritik olan bu konuyu, temelden ileri seviyeye kadar t\u00fcm detaylar\u0131yla ele alaca\u011f\u0131m\u0131z bu kapsaml\u0131 rehber, veritaban\u0131 y\u00f6netimi s\u00fcre\u00e7lerinizi optimize etmenize yard\u0131mc\u0131 olacak. Her geli\u015ftiricinin bilmesi gereken ipu\u00e7lar\u0131, pratik \u00f6rnekler ve ger\u00e7ek d\u00fcnya senaryolar\u0131yla Laravel Migrations&#8217;\u0131n g\u00fcc\u00fcn\u00fc ke\u015ffetmeye haz\u0131r olun. Amac\u0131m\u0131z, sadece &#8220;nas\u0131l yap\u0131l\u0131r&#8221;\u0131 anlatmak de\u011fil, ayn\u0131 zamanda &#8220;neden yap\u0131l\u0131r&#8221; sorusuna da tatmin edici yan\u0131tlar sunarak konuya derinlemesine hakim olman\u0131z\u0131 sa\u011flamakt\u0131r.<\/p>\n<h2>Laravel Migrations Temelleri: Veritaban\u0131 \u015eeman\u0131z\u0131 Ad\u0131m Ad\u0131m Nas\u0131l Olu\u015fturur ve Y\u00f6netirsiniz?<\/h2>\n<p>Laravel Migrations ile veritaban\u0131 y\u00f6netiminin temelini atmak olduk\u00e7a basittir ancak do\u011fru ad\u0131mlar\u0131 izlemek, gelecekte ya\u015fanabilecek potansiyel sorunlar\u0131n \u00f6n\u00fcne ge\u00e7mek i\u00e7in kritik \u00f6neme sahiptir. \u0130lk olarak, bir migration dosyas\u0131 olu\u015fturman\u0131z gerekir. Bu dosya, <code>php artisan make:migration<\/code> komutuyla kolayca olu\u015fturulur. \u00d6rne\u011fin, yeni bir <code>posts<\/code> tablosu olu\u015fturmak istedi\u011finizde, <code>php artisan make:migration create_posts_table<\/code> komutunu kullan\u0131rs\u0131n\u0131z. Laravel, bu komutla <code>database\/migrations<\/code> dizini alt\u0131nda, i\u00e7inde bir zaman damgas\u0131 ve migration ad\u0131n\u0131 i\u00e7eren yeni bir PHP dosyas\u0131 olu\u015fturur. Bu dosyada <code>up()<\/code> ve <code>down()<\/code> ad\u0131nda iki temel metot bulunur. <code>up()<\/code> metodu, veritaban\u0131na yap\u0131lmas\u0131 istenen de\u011fi\u015fiklikleri (\u00f6rne\u011fin yeni bir tablo olu\u015fturma, s\u00fctun ekleme) i\u00e7erirken, <code>down()<\/code> metodu ise bu de\u011fi\u015fiklikleri geri almak i\u00e7in (\u00f6rne\u011fin tabloyu silme, s\u00fctunu kald\u0131rma) kullan\u0131l\u0131r. Bu, her bir de\u011fi\u015fikli\u011fin hem ileri hem de geri y\u00f6nde nas\u0131l i\u015flenece\u011fini a\u00e7\u0131k\u00e7a tan\u0131mlad\u0131\u011f\u0131m\u0131z anlam\u0131na gelir ve bu \u00f6zellik, hatal\u0131 bir deploy durumunda h\u0131zla geri d\u00f6n\u00fc\u015f yapabilme yetene\u011fi a\u00e7\u0131s\u0131ndan paha bi\u00e7ilmezdir. Laravel&#8217;in Schema Builder s\u0131n\u0131f\u0131, veritaban\u0131 tablolar\u0131n\u0131 ve s\u00fctunlar\u0131n\u0131 programatik olarak tan\u0131mlaman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, yeni bir <code>posts<\/code> tablosu olu\u015fturmak ve i\u00e7ine <code>title<\/code> ve <code>content<\/code> s\u00fctunlar\u0131 eklemek i\u00e7in <code>up()<\/code> metodunuzda a\u015fa\u011f\u0131daki gibi bir yap\u0131 kullanabilirsiniz:<\/p>\n<pre><code class=\"language-php\">Schema::create(&#039;posts&#039;, function (Blueprint $table) {\n    $table->id();\n    $table->string(&#039;title&#039;);\n    $table->text(&#039;content&#039;);\n    $table->timestamps();\n});<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Schema::create()<\/code> metodu yeni bir tablo olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. <code>Blueprint<\/code> nesnesi ise tablonun s\u00fctunlar\u0131n\u0131 tan\u0131mlamam\u0131z\u0131 sa\u011flar. <code>id()<\/code> otomatik artan birincil anahtar, <code>string()<\/code> k\u0131sa metin (VARCHAR), <code>text()<\/code> daha uzun metin ve <code>timestamps()<\/code> ise <code>created_at<\/code> ve <code>updated_at<\/code> ad\u0131nda iki adet zaman damgas\u0131 s\u00fctunu ekler. <code>down()<\/code> metodunda ise, olu\u015fturdu\u011fumuz tablonun silinmesi gerekti\u011fini belirtiriz:<\/p>\n<pre><code class=\"language-php\">Schema::dropIfExists(&#039;posts&#039;);<\/pre>\n<p><\/code><\/p>\n<p>Migration dosyan\u0131z\u0131 olu\u015fturup kaydettikten sonra, veritaban\u0131n\u0131za uygulamak i\u00e7in <code>php artisan migrate<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131rs\u0131n\u0131z. Bu komut, hen\u00fcz uygulanmam\u0131\u015f t\u00fcm migration'lar\u0131 s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131r. E\u011fer bir hatayla kar\u015f\u0131la\u015f\u0131rsan\u0131z veya de\u011fi\u015fiklikleri geri almak isterseniz, <code>php artisan migrate:rollback<\/code> komutu en son uygulanan migration batch'ini geri al\u0131r. Bu temel ad\u0131mlar, Laravel projelerinizde veritaban\u0131 \u015femas\u0131n\u0131 yap\u0131land\u0131rman\u0131n ve y\u00f6netmenin omurgas\u0131n\u0131 olu\u015fturur. Projenizin b\u00fcy\u00fckl\u00fc\u011f\u00fc ne olursa olsun, bu ad\u0131mlar\u0131 do\u011fru ve tutarl\u0131 bir \u015fekilde uygulamak, uzun vadede size b\u00fcy\u00fck kolayl\u0131klar sa\u011flayacakt\u0131r. Unutmamak gerekir ki, her migration'\u0131n bir amac\u0131 olmal\u0131 ve de\u011fi\u015fiklikleri net bir \u015fekilde ifade etmelidir. Bu, ekip \u00fcyeleri aras\u0131nda veritaban\u0131 de\u011fi\u015fiklikleri hakk\u0131nda ortak bir anlay\u0131\u015f olu\u015fturulmas\u0131na da yard\u0131mc\u0131 olur.<\/p>\n<h3>Tablo ve S\u00fctun Y\u00f6netimi: Pratik Uygulamalarla Schema Builder'a Derinlemesine Bak\u0131\u015f<\/h3>\n<p>Laravel'in Schema Builder'\u0131, sadece yeni tablolar olu\u015fturmaktan \u00e7ok daha fazlas\u0131n\u0131 yapman\u0131za olanak tan\u0131r; mevcut tablolar\u0131 de\u011fi\u015ftirmek, s\u00fctun eklemek, silmek, de\u011fi\u015ftirmek ve indeksler ile yabanc\u0131 anahtarlar gibi k\u0131s\u0131tlamalar\u0131 y\u00f6netmek i\u00e7in de g\u00fc\u00e7l\u00fc ara\u00e7lar sunar. Bu b\u00f6l\u00fcmde, Schema Builder'\u0131n pratik uygulamalar\u0131na daha yak\u0131ndan bakarak, veritaban\u0131 \u015feman\u0131z\u0131 dinamik ve esnek bir \u015fekilde nas\u0131l y\u00f6netebilece\u011finizi inceleyece\u011fiz. Mevcut bir tabloya yeni bir s\u00fctun eklemek istedi\u011finizde, yeni bir migration dosyas\u0131 olu\u015fturur ve <code>Schema::table()<\/code> metodunu kullan\u0131rs\u0131n\u0131z. \u00d6rne\u011fin, <code>users<\/code> tablosuna <code>address<\/code> s\u00fctunu eklemek i\u00e7in a\u015fa\u011f\u0131daki gibi bir migration olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-php\">Schema::table(&#039;users&#039;, function (Blueprint $table) {\n    $table->string(&#039;address&#039;)->nullable()->after(&#039;email&#039;);\n});<\/pre>\n<p><\/code><br \/>\n<code>after(&#039;email&#039;)<\/code> metodu, yeni <code>address<\/code> s\u00fctununun <code>email<\/code> s\u00fctunundan hemen sonra yerle\u015ftirilmesini sa\u011flar, bu da veritaban\u0131 \u015feman\u0131z\u0131n daha d\u00fczenli g\u00f6r\u00fcnmesine yard\u0131mc\u0131 olur. <code>nullable()<\/code> ise bu s\u00fctunun bo\u015f b\u0131rak\u0131labilece\u011fini belirtir. Ayn\u0131 \u015fekilde, bir s\u00fctunun \u00f6zelliklerini de\u011fi\u015ftirmek i\u00e7in <code>change()<\/code> metodunu kullan\u0131r\u0131z. Ancak bunu yapabilmek i\u00e7in \u00f6ncelikle <code>composer require doctrine\/dbal<\/code> komutuyla <code>Doctrine DBAL<\/code> k\u00fct\u00fcphanesini projenize eklemeniz gerekir. Diyelim ki <code>posts<\/code> tablosundaki <code>title<\/code> s\u00fctununu daha uzun bir metin tipine (\u00f6rne\u011fin <code>mediumText<\/code>) \u00e7evirmek istiyorsunuz:<\/p>\n<pre><code class=\"language-php\">Schema::table(&#039;posts&#039;, function (Blueprint $table) {\n    $table->mediumText(&#039;title&#039;)->change();\n});<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-php\">S\u00fctun silme veya yeniden adland\u0131rma da benzer \u015fekilde kolayd\u0131r:<\/pre>\n<p><\/code>Schema::table(&#039;posts&#039;, function (Blueprint $table) {<br \/>\n    $table->dropColumn(&#039;subtitle&#039;); \/\/ S\u00fctunu siler<br \/>\n    $table->renameColumn(&#039;old_name&#039;, &#039;new_name&#039;); \/\/ S\u00fctunu yeniden adland\u0131r\u0131r<br \/>\n});<\/code><\/p>\n<pre><code class=\"language-php\">\u0130ndeksler, veritaban\u0131 sorgular\u0131n\u0131n performans\u0131n\u0131 art\u0131rmak i\u00e7in hayati \u00f6neme sahiptir. Laravel, \u00e7e\u015fitli indeks t\u00fcrlerini kolayca tan\u0131mlaman\u0131za olanak tan\u0131r:<\/pre>\n<p><\/code>Schema::table(&#039;products&#039;, function (Blueprint $table) {<br \/>\n    $table->string(&#039;sku&#039;)->unique(); \/\/ Benzersiz indeks<br \/>\n    $table->index(&#039;category_id&#039;); \/\/ Normal indeks<br \/>\n    $table->fullText(&#039;description&#039;); \/\/ Tam metin indeksi (destekleyen veritabanlar\u0131 i\u00e7in)<br \/>\n});<\/code><br \/>\nYabanc\u0131 anahtarlar (Foreign Keys) ise tablolar aras\u0131ndaki ili\u015fkileri tan\u0131mlayarak veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flarlar. \u00d6rne\u011fin, <code>posts<\/code> tablosundaki her g\u00f6nderinin bir <code>user<\/code>'a ait oldu\u011funu belirtmek i\u00e7in:<\/p>\n<pre><code class=\"language-php\">Schema::table(&#039;posts&#039;, function (Blueprint $table) {\n    $table->foreignId(&#039;user_id&#039;)->constrained()->onDelete(&#039;cascade&#039;);\n});<\/pre>\n<p><\/code><br \/>\nBurada <code>constrained()<\/code> metodu, Laravel'in varsay\u0131lan olarak <code>users<\/code> tablosunun <code>id<\/code> s\u00fctununa referans vermesini sa\u011flar. <code>onDelete(&#039;cascade&#039;)<\/code> ise, ili\u015fkili kullan\u0131c\u0131 silindi\u011finde ona ait g\u00f6nderilerin de otomatik olarak silinece\u011fini belirtir. Bu gibi kaskatlama i\u015flemleri, veri tutarl\u0131l\u0131\u011f\u0131n\u0131 korurken geli\u015ftiricinin i\u015f y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Schema Builder'\u0131n bu esnekli\u011fi, projenizin ihtiya\u00e7lar\u0131 de\u011fi\u015ftik\u00e7e veritaban\u0131 yap\u0131n\u0131z\u0131 sorunsuz bir \u015fekilde adapte etmenize olanak tan\u0131r. Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, bir e-ticaret uygulamas\u0131nda \u00fcr\u00fcnlerin kategorilere ayr\u0131lmas\u0131 ve bu kategoriler aras\u0131ndaki ili\u015fkilerin y\u00f6netilmesi gibi durumlarda, bu Schema Builder yetenekleri vazge\u00e7ilmezdir. \u00d6rne\u011fin, bir <code>products<\/code> tablonuz ve bir <code>categories<\/code> tablonuz varsa, \u00fcr\u00fcnlerin hangi kategoriye ait oldu\u011funu belirtmek i\u00e7in <code>products<\/code> tablosuna <code>category_id<\/code> s\u00fctununu ekleyip, <code>categories<\/code> tablosundaki <code>id<\/code> s\u00fctununa bir yabanc\u0131 anahtar k\u0131s\u0131tlamas\u0131 eklemeniz gerekir. Bu yakla\u015f\u0131m, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flarken, uygulaman\u0131z\u0131n daha sa\u011flam ve g\u00fcvenilir olmas\u0131n\u0131 garantiler.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Karma\u015f\u0131k \u015fema de\u011fi\u015fikliklerinde, mevcut verilerinizi kaybetmemek i\u00e7in her zaman bir yedek al\u0131n ve <code>change()<\/code> metodu ile s\u00fctun \u00f6zelliklerini de\u011fi\u015ftirirken veri tipi d\u00f6n\u00fc\u015f\u00fcmlerinin uyumlu oldu\u011fundan emin olun. Ayr\u0131ca, <code>Schema::disableForeignKeyConstraints()<\/code> ve <code>Schema::enableForeignKeyConstraints()<\/code> metotlar\u0131n\u0131 kullanarak ge\u00e7ici olarak yabanc\u0131 anahtar kontrollerini devre d\u0131\u015f\u0131 b\u0131rak\u0131p tekrar etkinle\u015ftirebilirsiniz, bu da baz\u0131 karma\u015f\u0131k migration senaryolar\u0131nda i\u015fleri kolayla\u015ft\u0131r\u0131r.\n<\/div>\n<h2>Geli\u015fmi\u015f Migrations Teknikleri: Veri B\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ve Performans\u0131 Nas\u0131l Sa\u011flars\u0131n\u0131z?<\/h2>\n<p>Veritaban\u0131 migration'lar\u0131, basit tablo de\u011fi\u015fikliklerinden \u00e7ok daha fazlas\u0131n\u0131 ifade eder; ayn\u0131 zamanda veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak, performans\u0131 optimize etmek ve uygulaman\u0131n uzun vadeli sa\u011fl\u0131\u011f\u0131n\u0131 garanti alt\u0131na almak i\u00e7in geli\u015fmi\u015f teknikleri kullanmay\u0131 gerektirir. Bu b\u00f6l\u00fcmde, deneyimli geli\u015ftiricilerin s\u0131kl\u0131kla ba\u015fvurdu\u011fu ileri d\u00fczey migration tekniklerine odaklanaca\u011f\u0131z. Bunlardan biri, migration'lar\u0131n i\u015flem (transaction) i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131d\u0131r. Laravel, varsay\u0131lan olarak migration'lar\u0131 veritaban\u0131 i\u015flemleri i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131r. Bu, bir migration s\u0131ras\u0131nda bir hata olu\u015fursa, veritaban\u0131n\u0131n hata \u00f6ncesindeki duruma geri d\u00f6nd\u00fcr\u00fclmesini sa\u011flar ve b\u00f6ylece k\u0131smen uygulanm\u0131\u015f, bozuk bir \u015femayla kalmaktan ka\u00e7\u0131n\u0131l\u0131r. E\u011fer \u00f6zel durumlar i\u00e7in bu \u00f6zelli\u011fi kapatmak isterseniz, migration s\u0131n\u0131f\u0131n\u0131zda <code>public $chunk = false;<\/code> (Laravel 8 \u00f6ncesi) veya <code>public $batch = false;<\/code> (Laravel 8 sonras\u0131) gibi bir \u00f6zellik tan\u0131mlayabilirsiniz ancak bu \u00f6nerilmez. Veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak i\u00e7in en \u00f6nemli ara\u00e7lardan biri yabanc\u0131 anahtar k\u0131s\u0131tlamalar\u0131d\u0131r. Daha \u00f6nce de bahsetti\u011fimiz gibi, <code>foreignId()->constrained()<\/code> ile basit ili\u015fkileri kurabiliriz. Ancak, daha karma\u015f\u0131k k\u0131s\u0131tlamalar veya farkl\u0131 silme\/g\u00fcncelleme davran\u0131\u015flar\u0131 gerekti\u011finde <code>onDelete()<\/code> ve <code>onUpdate()<\/code> metotlar\u0131n\u0131 kullan\u0131r\u0131z. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n silinmesi durumunda onun t\u00fcm yorumlar\u0131n\u0131n da silinmesini istiyorsan\u0131z <code>onDelete(&#039;cascade&#039;)<\/code> kullan\u0131rs\u0131n\u0131z. E\u011fer yorumlar\u0131n kullan\u0131c\u0131s\u0131z kalmas\u0131n\u0131 (NULL olarak ayarlanmas\u0131n\u0131) isterseniz <code>onDelete(&#039;set null&#039;)<\/code> kullanabilirsiniz.<\/p>\n<pre><code class=\"language-php\">Schema::table(&#039;comments&#039;, function (Blueprint $table) {\n    $table->foreignId(&#039;user_id&#039;)->nullable()->constrained()->onDelete(&#039;set null&#039;);\n});<\/pre>\n<p><\/code><br \/>\nPerformans a\u00e7\u0131s\u0131ndan, indeksleme kritik bir rol oynar. Sadece <code>unique()<\/code> veya <code>index()<\/code> kullanmakla kalmay\u0131p, \u00e7oklu s\u00fctun indeksleri (composite indexes) de tan\u0131mlayabilirsiniz. \u00d6rne\u011fin, bir kullan\u0131c\u0131 ad\u0131 ve e-posta kombinasyonunun benzersiz olmas\u0131n\u0131 istiyorsan\u0131z:<\/p>\n<pre><code class=\"language-php\">Schema::table(&#039;users&#039;, function (Blueprint $table) {\n    $table->unique([&#039;username&#039;, &#039;email&#039;]);\n});<\/pre>\n<p><\/code><br \/>\nBu, \u00f6zellikle s\u0131k sorgulanan s\u00fctun kombinasyonlar\u0131 i\u00e7in sorgu performans\u0131n\u0131 art\u0131rabilir. Ayr\u0131ca, <code>softDeletes()<\/code> metodu Laravel'in \"yumu\u015fak silme\" (soft delete) \u00f6zelli\u011fini etkinle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Bu, bir kayd\u0131n veritaban\u0131ndan kal\u0131c\u0131 olarak silinmek yerine, <code>deleted_at<\/code> s\u00fctununa bir zaman damgas\u0131 eklenerek i\u015faretlenmesini sa\u011flar. Bu, veri kurtarma ve ge\u00e7mi\u015fi izleme a\u00e7\u0131s\u0131ndan \u00e7ok de\u011ferli bir \u00f6zelliktir.<\/p>\n<pre><code class=\"language-php\">Schema::table(&#039;products&#039;, function (Blueprint $table) {\n    $table->softDeletes();\n});<\/pre>\n<p><\/code><br \/>\nMigrations s\u0131ras\u0131nda mevcut verileri g\u00fcncellemeniz gerekebilir. Bu t\u00fcr durumlarda, migration dosyan\u0131zda basit bir SQL sorgusu \u00e7al\u0131\u015ft\u0131rmak veya Eloquent modellerinizi kullanarak veri manipulasyonu yapmak m\u00fcmk\u00fcnd\u00fcr. Ancak, migration'lar genel olarak \u015fema de\u011fi\u015fiklikleri i\u00e7in tasarland\u0131\u011f\u0131ndan, veri manip\u00fclasyonu i\u015flemlerini <code>seeders<\/code> ile yapmak daha iyi bir uygulamad\u0131r.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Veritaban\u0131n\u0131zdaki tablolar\u0131 yeniden adland\u0131rman\u0131z gerekti\u011finde <code>Schema::rename(&#039;old_table_name&#039;, &#039;new_table_name&#039;);<\/code> metodunu kullanabilirsiniz. Bu, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k \u015femalarda tablonun tamamen silinip yeniden olu\u015fturulmas\u0131ndan daha verimlidir. Ayn\u0131 \u015fekilde, bir s\u00fctunu yeniden adland\u0131rmak i\u00e7in <code>renameColumn()<\/code> metodunu kullanabilirsiniz, ancak bunun i\u00e7in <code>doctrine\/dbal<\/code> paketinin y\u00fckl\u00fc olmas\u0131 gerekti\u011fini unutmay\u0131n.\n<\/div>\n<h3>Veritaban\u0131 Seeders ve State Y\u00f6netimi: Uygulaman\u0131z\u0131 Test Verileriyle Nas\u0131l Doldurursunuz?<\/h3>\n<p>Laravel Migrations, veritaban\u0131 \u015femas\u0131n\u0131 y\u00f6netirken, Seeders ise bu \u015femay\u0131 \u00f6rnek veya test verileriyle doldurmak i\u00e7in m\u00fckemmel bir tamamlay\u0131c\u0131d\u0131r. Geli\u015ftirme s\u00fcrecinde veya test ortamlar\u0131nda, uygulamam\u0131z\u0131n belirli bir ba\u015flang\u0131\u00e7 durumuna sahip olmas\u0131, do\u011fru \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 anlamak i\u00e7in hayati \u00f6neme sahiptir. Seeders, bu \"ba\u015flang\u0131\u00e7 durumunu\" kolayca olu\u015fturmam\u0131z\u0131 sa\u011flar. Bir seeder dosyas\u0131 olu\u015fturmak i\u00e7in <code>php artisan make:seeder UserSeeder<\/code> komutunu kullan\u0131r\u0131z. Bu, <code>database\/seeders<\/code> dizini alt\u0131nda yeni bir PHP dosyas\u0131 olu\u015fturur. Bu dosyada <code>run()<\/code> ad\u0131nda bir metot bulunur ve bu metot, seeder \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda ger\u00e7ekle\u015ftirilecek veri ekleme i\u015flemlerini i\u00e7erir. \u00d6rne\u011fin, bir <code>UserSeeder<\/code> ile varsay\u0131lan bir kullan\u0131c\u0131 olu\u015fturabiliriz:<\/p>\n<pre><code class=\"language-php\">\/\/ database\/seeders\/UserSeeder.php\nuse App\\Models\\User;\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\Hash;\n\nclass UserSeeder extends Seeder\n{\n    public function run()\n    {\n        User::create([\n            &#039;name&#039; => &#039;Test User&#039;,\n            &#039;email&#039; => &#039;test@example.com&#039;,\n            &#039;password&#039; => Hash::make(&#039;password&#039;),\n        ]);\n        \/\/ Ayr\u0131ca birden fazla kullan\u0131c\u0131 olu\u015fturmak i\u00e7in Factory&#039;leri kullanabilirsiniz.\n        User::factory()->count(10)->create();\n    }\n}<\/pre>\n<p><\/code><br \/>\nBu seeder'\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>database\/seeders\/DatabaseSeeder.php<\/code> dosyas\u0131nda \u00e7a\u011f\u0131r\u0131r\u0131z:<\/p>\n<pre><code class=\"language-php\">\/\/ database\/seeders\/DatabaseSeeder.php\nuse Illuminate\\Database\\Seeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    public function run()\n    {\n        $this->call([\n            UserSeeder::class,\n            \/\/ Di\u011fer seeder&#039;lar buraya eklenebilir\n        ]);\n    }\n}<\/pre>\n<p><\/code><br \/>\nDaha sonra, t\u00fcm seeder'lar\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>php artisan db:seed<\/code> komutunu kullan\u0131r\u0131z. E\u011fer sadece belirli bir seeder'\u0131 \u00e7al\u0131\u015ft\u0131rmak isterseniz <code>php artisan db:seed --class=UserSeeder<\/code> komutuyla bunu yapabilirsiniz. Test verilerini olu\u015fturman\u0131n daha geli\u015fmi\u015f bir yolu ise Model Factories kullanmakt\u0131r. Factories, ger\u00e7ek\u00e7i g\u00f6r\u00fcn\u00fcml\u00fc ancak rastgele verilerle model \u00f6rnekleri olu\u015fturmay\u0131 kolayla\u015ft\u0131r\u0131r. \u00d6rne\u011fin, 100 adet sahte kullan\u0131c\u0131 olu\u015fturmak i\u00e7in:<\/p>\n<pre><code class=\"language-php\">\/\/ database\/factories\/UserFactory.php\nuse App\\Models\\User;\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Illuminate\\Support\\Str;\n\nclass UserFactory extends Factory\n{\n    protected $model = User::class;\n\n    public function definition()\n    {\n        return [\n            &#039;name&#039; => $this->faker->name(),\n            &#039;email&#039; => $this->faker->unique()->safeEmail(),\n            &#039;email_verified_at&#039; => now(),\n            &#039;password&#039; => &#039;$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9z\/eK.z.G8L.f0zQ.oK.K.W&#039;, \/\/ password\n            &#039;remember_token&#039; => Str::random(10),\n        ];\n    }\n}<\/pre>\n<p><\/code><br \/>\nSeeder dosyan\u0131zda <code>User::factory()->count(50)->create();<\/code> gibi bir sat\u0131r ekleyerek y\u00fczlerce sahte kullan\u0131c\u0131y\u0131 kolayca veritaban\u0131n\u0131za ekleyebilirsiniz. Veritaban\u0131 state y\u00f6netimi a\u00e7\u0131s\u0131ndan, <code>php artisan migrate:refresh<\/code> komutu, t\u00fcm migration'lar\u0131 geri al\u0131r ve ard\u0131ndan yeniden \u00e7al\u0131\u015ft\u0131r\u0131r. Bu, veritaban\u0131n\u0131z\u0131 s\u0131f\u0131rlay\u0131p t\u00fcm migration'lar\u0131 temiz bir \u015fekilde uygulamak istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r. E\u011fer bu i\u015flem s\u0131ras\u0131nda seeder'lar\u0131n da \u00e7al\u0131\u015fmas\u0131n\u0131 isterseniz <code>php artisan migrate:refresh --seed<\/code> komutunu kullanabilirsiniz. Tamamen temiz bir ba\u015flang\u0131\u00e7 i\u00e7in <code>php artisan migrate:fresh<\/code> komutu, mevcut t\u00fcm tablolar\u0131 veritaban\u0131ndan siler ve ard\u0131ndan t\u00fcm migration'lar\u0131 yeniden \u00e7al\u0131\u015ft\u0131r\u0131r. Bu komut da <code>--seed<\/code> bayra\u011f\u0131 ile kullan\u0131labilir. Bu komutlar, \u00f6zellikle geli\u015ftirme ortam\u0131nda s\u0131k\u00e7a veritaban\u0131 yap\u0131s\u0131n\u0131 de\u011fi\u015ftirip test verileriyle doldurman\u0131z gerekti\u011finde geli\u015ftirici verimlili\u011fini art\u0131r\u0131r. Ger\u00e7ek d\u00fcnya vaka analizinde, bir e-ticaret uygulamas\u0131nda farkl\u0131 \u00fcr\u00fcn kategorileri, binlerce \u00fcr\u00fcn, m\u00fc\u015fteri yorumlar\u0131 ve sipari\u015f verileri gibi karma\u015f\u0131k veri setlerini test etmek i\u00e7in factories ve seeders bir araya getirilir. Bu sayede, uygulaman\u0131n farkl\u0131 senaryolara nas\u0131l tepki verdi\u011fini h\u0131zl\u0131ca g\u00f6rebilir, performans sorunlar\u0131n\u0131 erkenden tespit edebilir ve geli\u015ftirme s\u00fcrecini h\u0131zland\u0131rabilirsiniz.<\/p>\n<h2>Deployment ve Ekip \u0130\u015fbirli\u011fi: Canl\u0131 Ortamda Migrations Nas\u0131l Sorunsuz Y\u00f6netilir?<\/h2>\n<p>Bir Laravel uygulamas\u0131n\u0131 canl\u0131ya al\u0131rken veya birden fazla geli\u015ftiricinin ayn\u0131 proje \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda, migration'lar\u0131n do\u011fru ve tutarl\u0131 bir \u015fekilde y\u00f6netilmesi projenin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. Yanl\u0131\u015f uygulanan bir migration, canl\u0131 ortamda ciddi veri kayb\u0131na veya uygulama kesintisine yol a\u00e7abilirken, ekip i\u00e7inde uyumsuz veritaban\u0131 \u015femalar\u0131 geli\u015ftirme s\u00fcrecini yava\u015flatabilir. Canl\u0131 ortama deployment yaparken en \u00f6nemli noktalardan biri, migration'lar\u0131n otomatik olarak \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131d\u0131r. \u00c7o\u011fu CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) s\u00fcrecinde, yeni kod canl\u0131 sunucuya y\u00fcklendikten sonra <code>php artisan migrate --force<\/code> komutu \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. <code>--force<\/code> bayra\u011f\u0131, komutun \u00fcretim ortam\u0131nda onay istemeden \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar, bu da otomatize edilmi\u015f da\u011f\u0131t\u0131m s\u00fcre\u00e7leri i\u00e7in gereklidir. Ancak, bu komutu otomatize ederken dikkatli olmak ve migration'lar\u0131n\u0131z\u0131n hatas\u0131z oldu\u011fundan emin olmak esast\u0131r. Hata durumunda otomatik rollback mekanizmalar\u0131 veya h\u0131zl\u0131 geri d\u00f6n\u00fc\u015f planlar\u0131 olu\u015fturmak, olas\u0131 riskleri minimize etmeye yard\u0131mc\u0131 olur. Ekip i\u015fbirli\u011fi s\u00f6z konusu oldu\u011funda, migration \u00e7ak\u0131\u015fmalar\u0131 (migration conflicts) s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan bir sorundur. \u0130ki geli\u015ftiricinin ayn\u0131 anda benzer veritaban\u0131 de\u011fi\u015fiklikleri \u00fczerinde \u00e7al\u0131\u015fmas\u0131 ve ayn\u0131 migration dosya adland\u0131rma konvansiyonunu kullanmas\u0131 durumunda ortaya \u00e7\u0131kabilir. Bu t\u00fcr \u00e7ak\u0131\u015fmalar\u0131 \u00f6nlemek i\u00e7in:<\/p>\n<ul>\n<li>Her bir migration'\u0131n sadece tek bir amaca hizmet etmesini sa\u011flay\u0131n (\u00f6rn. \"add_posts_table\" yerine \"add_title_to_posts_table\").<\/li>\n<li>Migration dosyalar\u0131n\u0131 olu\u015ftururken a\u00e7\u0131klay\u0131c\u0131 ve spesifik isimler kullan\u0131n.<\/li>\n<li>D\u00fczenli olarak <code>git pull<\/code> yaparak di\u011fer ekip \u00fcyelerinin de\u011fi\u015fikliklerini entegre edin.<\/li>\n<li>Karma\u015f\u0131k veya b\u00fcy\u00fck veritaban\u0131 de\u011fi\u015fikliklerini, ekip \u00fcyeleri aras\u0131nda \u00f6nceden tart\u0131\u015farak planlay\u0131n.<\/li>\n<\/ul>\n<p>Hotfix'ler veya acil durum d\u00fczeltmeleri gerekti\u011finde, h\u0131zl\u0131 bir migration uygulamak ve gerekti\u011finde geri almak da \u00f6nemlidir. <code>php artisan migrate:rollback --step=1<\/code> komutu, yaln\u0131zca son batch'teki bir migration'\u0131 geri alman\u0131z\u0131 sa\u011flar, bu da daha kontroll\u00fc bir geri d\u00f6n\u00fc\u015f imkan\u0131 sunar. Canl\u0131 ortamdaki veritaban\u0131 durumunu izlemek ve migration'lar\u0131n sorunsuz \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in ara\u00e7lar geli\u015ftirmek, geli\u015ftirici deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirebilir. \u00d6rne\u011fin, bir y\u00f6netici paneli \u00fczerinden migration durumlar\u0131n\u0131 g\u00f6steren ve hatta migration'lar\u0131 tetiklemeye izin veren bir aray\u00fcz tasarlanabilir. Bu t\u00fcr bir aray\u00fcz geli\u015ftirirken, mobil uyumluluk modern web uygulamalar\u0131 i\u00e7in vazge\u00e7ilmezdir. Geli\u015ftiriciler, mobil cihazlar\u0131 \u00fczerinden bile h\u0131zl\u0131ca kontrol ve m\u00fcdahale edebilmelidir. Basit bir \u00f6rnekle, responsive tasar\u0131m nas\u0131l uygulanabilir:<\/p>\n<pre><code class=\"language-html\"><style>\n  .migration-status-table {\n    width: 100%;\n    border-collapse: collapse;\n  }\n  .migration-status-table th, .migration-status-table td {\n    padding: 8px;\n    border: 1px solid #ddd;\n    text-align: left;\n  }\n  @media (max-width: 768px) {\n    .migration-status-table, .migration-status-table tbody, .migration-status-table tr, .migration-status-table td {\n      display: block;\n      width: 100%;\n    }\n    .migration-status-table thead {\n      display: none;\n    }\n    .migration-status-table td:nth-of-type(1):before { content: \"Migration Ad\u0131:\"; }\n    .migration-status-table td:nth-of-type(2):before { content: \"Durum:\"; }\n    .migration-status-table td:nth-of-type(3):before { content: \"Uygulanma Tarihi:\"; }\n    .migration-status-table td {\n      text-align: right;\n      padding-left: 50%;\n      position: relative;\n    }\n    .migration-status-table td::before {\n      content: attr(data-label);\n      position: absolute;\n      left: 6px;\n      width: 45%;\n      padding-right: 10px;\n      white-space: nowrap;\n      text-align: left;\n      font-weight: bold;\n    }\n  }\n<\/style>\n<table class=\"migration-status-table\">\n  <thead>\n    <tr>\n      <th>Migration Ad\u0131<\/th>\n      <th>Durum<\/th>\n      <th>Uygulanma Tarihi<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td data-label=\"Migration Ad\u0131\">2023_01_01_100000_create_users_table<\/td>\n      <td data-label=\"Durum\">Uyguland\u0131<\/td>\n      <td data-label=\"Uygulanma Tarihi\">2023-01-01 10:05:00<\/td>\n    <\/tr>\n    <!-- Di\u011fer migration&#039;lar -->\n  <\/tbody>\n<\/table><\/pre>\n<p><\/code><br \/>\nBu HTML ve CSS \u00f6rne\u011fi, migration'lar\u0131n durumunu g\u00f6steren bir tablonun mobil cihazlarda nas\u0131l daha okunabilir hale getirilebilece\u011fini g\u00f6stermektedir. Bu, do\u011frudan migration koduyla ilgili olmasa da, Laravel'in sa\u011flad\u0131\u011f\u0131 geli\u015ftirici ara\u00e7lar\u0131n\u0131n (\u00f6rne\u011fin Telescope, Horizon gibi) kullan\u0131c\u0131 aray\u00fczlerinin de modern standartlara uygun olmas\u0131 gerekti\u011fi fikrini peki\u015ftirir. Nihayetinde, iyi y\u00f6netilen migration s\u00fcre\u00e7leri, canl\u0131 uygulamalar\u0131n\u0131z\u0131n istikrar\u0131n\u0131 ve geli\u015ftirme ekiplerinizin verimlili\u011fini do\u011frudan etkileyen temel fakt\u00f6rlerden biridir.<\/p>\n<h2>Laravel Migrations'\u0131n Gelece\u011fi ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Laravel Migrations, y\u0131llar i\u00e7inde geli\u015ferek daha da g\u00fc\u00e7l\u00fc ve esnek hale geldi. 2025 ve sonras\u0131nda da veritaban\u0131 \u015fema y\u00f6netimindeki merkezi rol\u00fcn\u00fc s\u00fcrd\u00fcrece\u011fi a\u00e7\u0131k. Gelecekte, Laravel ekibinin yapay zeka destekli migration \u00f6nerileri, daha ak\u0131ll\u0131 hata tespiti ve hatta daha sofistike veritaban\u0131 de\u011fi\u015fikliklerini otomatikle\u015ftirme gibi yenilikleri entegre etme potansiyeli bulunuyor. \u00d6zellikle veritaban\u0131 yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmek ve mevcut verileri ta\u015f\u0131mak gibi karma\u015f\u0131k senaryolarda, otomatikle\u015ftirilmi\u015f ara\u00e7lar\u0131n geli\u015ftiricilere daha fazla destek sa\u011flamas\u0131 bekleniyor. Bu kapsaml\u0131 rehberde, Laravel Migrations'\u0131n ne oldu\u011fundan temel kullan\u0131m\u0131na, geli\u015fmi\u015f tekniklerden deployment stratejilerine kadar bir\u00e7ok konuyu ele ald\u0131k. Geli\u015ftirme s\u00fcre\u00e7lerinizde Migrations'\u0131 do\u011fru ve bilin\u00e7li bir \u015fekilde kullanarak, veritaban\u0131 \u015feman\u0131z\u0131 etkili bir bi\u00e7imde y\u00f6netebilir, ekip i\u00e7i i\u015fbirli\u011fini kolayla\u015ft\u0131rabilir ve uygulaman\u0131z\u0131n uzun vadeli s\u00fcrd\u00fcr\u00fclebilirli\u011fini garanti alt\u0131na alabilirsiniz. Unutmay\u0131n ki, her iyi Laravel projesinin temelinde, sa\u011flam ve iyi y\u00f6netilmi\u015f bir veritaban\u0131 \u015femas\u0131 yatar. Migrations, bu temeli olu\u015fturmak i\u00e7in en g\u00fcvenilir ara\u00e7lar\u0131n\u0131zdan biridir.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Projelerinizde s\u00fcrekli olarak belirli veri tiplerini veya s\u00fctun kombinasyonlar\u0131n\u0131 kullan\u0131yorsan\u0131z, \u00f6zel Blueprint macro'lar\u0131 olu\u015fturarak migration dosyalar\u0131n\u0131z\u0131 daha k\u0131sa ve okunabilir hale getirebilirsiniz. Bu, \u00f6zellikle b\u00fcy\u00fck ekiplerde kod tutarl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve tekrar eden yaz\u0131m hatalar\u0131n\u0131 azalt\u0131r.\n<\/div>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n        <strong>Bir migration dosyas\u0131nda birden fazla tablo olu\u015fturabilir miyim?<\/strong><\/p>\n<p>Evet, bir migration dosyas\u0131n\u0131n <code>up()<\/code> metodu i\u00e7inde birden fazla <code>Schema::create()<\/code> veya <code>Schema::table()<\/code> \u00e7a\u011fr\u0131s\u0131 yapabilirsiniz. Ancak, migration'lar\u0131n genellikle tek bir amaca hizmet etmesi, okunabilirli\u011fi ve y\u00f6netilebilirli\u011fi art\u0131rd\u0131\u011f\u0131 i\u00e7in \u00f6nerilen uygulama de\u011fildir. Her tablo i\u00e7in ayr\u0131 bir migration olu\u015fturmak daha iyi bir yakla\u015f\u0131md\u0131r.<\/p>\n<\/li>\n<li>\n        <strong><code>php artisan migrate:fresh<\/code> ile <code>php artisan migrate:refresh<\/code> aras\u0131ndaki fark nedir?<\/strong><\/p>\n<p><code>migrate:fresh<\/code> komutu, veritaban\u0131ndaki t\u00fcm tablolar\u0131 tamamen siler ve ard\u0131ndan t\u00fcm migration'lar\u0131 yeniden \u00e7al\u0131\u015ft\u0131r\u0131r. <code>migrate:refresh<\/code> ise, t\u00fcm migration'lar\u0131 <code>down()<\/code> metotlar\u0131n\u0131 kullanarak geri al\u0131r ve ard\u0131ndan <code>up()<\/code> metotlar\u0131n\u0131 kullanarak yeniden \u00e7al\u0131\u015ft\u0131r\u0131r. <code>migrate:fresh<\/code> daha h\u0131zl\u0131 olabilir \u00e7\u00fcnk\u00fc tablolar\u0131 tek tek geri almak yerine do\u011frudan siler, ancak <code>down()<\/code> metotlar\u0131n\u0131z\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak istiyorsan\u0131z <code>migrate:refresh<\/code> daha g\u00fcvenli bir se\u00e7enek olabilir.<\/p>\n<\/li>\n<li>\n        <strong>Canl\u0131 ortamda yanl\u0131\u015fl\u0131kla <code>migrate:rollback<\/code> yaparsam ne olur?<\/strong><\/p>\n<p>Canl\u0131 ortamda <code>migrate:rollback<\/code> komutunu <code>--force<\/code> bayra\u011f\u0131 ile \u00e7al\u0131\u015ft\u0131rmak, en son uygulanan migration(lar\u0131) geri al\u0131r ve veritaban\u0131 \u015femas\u0131nda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fiklikleri geri \u00e7evirir. Bu, e\u011fer bu migrationlar veri kayb\u0131na yol a\u00e7abilecek s\u00fctun silme gibi i\u015flemler i\u00e7eriyorsa, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmamas\u0131na veya \u00f6nemli veri kayb\u0131na neden olabilir. Bu nedenle canl\u0131 ortamda migration komutlar\u0131n\u0131 \u00e7ok dikkatli kullanmal\u0131, <code>--force<\/code> bayra\u011f\u0131n\u0131 kullanmadan \u00f6nce iyi d\u00fc\u015f\u00fcn\u00fclm\u00fc\u015f bir da\u011f\u0131t\u0131m stratejiniz olmal\u0131d\u0131r.<\/p>\n<\/li>\n<li>\n        <strong>Migration'lar\u0131m\u0131 farkl\u0131 veritaban\u0131 ba\u011flant\u0131lar\u0131na nas\u0131l uygulayabilirim?<\/strong><\/p>\n<p>Laravel, birden fazla veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 destekler. Migration'lar\u0131n\u0131z\u0131 belirli bir ba\u011flant\u0131ya uygulamak i\u00e7in <code>php artisan migrate --database=your_connection_name<\/code> komutunu kullanabilirsiniz. <code>your_connection_name<\/code> yerine <code>config\/database.php<\/code> dosyan\u0131zda tan\u0131mlad\u0131\u011f\u0131n\u0131z ba\u011flant\u0131 ad\u0131n\u0131 yazman\u0131z yeterlidir.<\/p>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"Laravel projelerinizde veritaban\u0131 \u015femas\u0131n\u0131 y\u00f6netmek karma\u015f\u0131k m\u0131 geliyor? \u00d6zellikle ekip \u00e7al\u0131\u015fmas\u0131 yaparken veya bir uygulamay\u0131 farkl\u0131 ortamlara (geli\u015ftirme,&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[133],"tags":[],"class_list":{"0":"post-31310","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Laravel Migrations K\u0131lavuzu 2025: Veritaban\u0131 Y\u00f6netiminde Uzmanla\u015f\u0131n<\/title>\n<meta name=\"description\" content=\"Evet, bir migration dosyas\u0131n\u0131n `up()` metodu i\u00e7inde birden fazla `Schema::create()` veya `Schema::table()` \u00e7a\u011fr\u0131s\u0131 yapabilirsiniz. Ancak, migration&#039;lar\u0131n genellikle tek bir amaca hizmet etmesi, okunabilirli\u011fi ve y\u00f6netilebilirli\u011fi art\u0131rd\u0131\u011f\u0131 i\u00e7in \u00f6nerilen uygulama de\u011fildir. Her tablo i\u00e7in ayr\u0131 bir migration olu\u015fturmak daha iyi bir yakla\u015f\u0131md\u0131r.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Laravel Migrations K\u0131lavuzu 2025: Veritaban\u0131 Y\u00f6netiminde Uzmanla\u015f\u0131n\" \/>\n<meta property=\"og:description\" content=\"Evet, bir migration dosyas\u0131n\u0131n `up()` metodu i\u00e7inde birden fazla `Schema::create()` veya `Schema::table()` \u00e7a\u011fr\u0131s\u0131 yapabilirsiniz. Ancak, migration&#039;lar\u0131n genellikle tek bir amaca hizmet etmesi, okunabilirli\u011fi ve y\u00f6netilebilirli\u011fi art\u0131rd\u0131\u011f\u0131 i\u00e7in \u00f6nerilen uygulama de\u011fildir. Her tablo i\u00e7in ayr\u0131 bir migration olu\u015fturmak daha iyi bir yakla\u015f\u0131md\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-08T10:33:37+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Laravel Migrations K\u0131lavuzu 2025: Veritaban\u0131 Y\u00f6netiminde Uzmanla\u015f\u0131n\",\"datePublished\":\"2025-10-08T10:33:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/\"},\"wordCount\":3253,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PHP\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/\",\"name\":\"Laravel Migrations K\u0131lavuzu 2025: Veritaban\u0131 Y\u00f6netiminde Uzmanla\u015f\u0131n\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-08T10:33:37+00:00\",\"description\":\"Evet, bir migration dosyas\u0131n\u0131n `up()` metodu i\u00e7inde birden fazla `Schema::create()` veya `Schema::table()` \u00e7a\u011fr\u0131s\u0131 yapabilirsiniz. Ancak, migration'lar\u0131n genellikle tek bir amaca hizmet etmesi, okunabilirli\u011fi ve y\u00f6netilebilirli\u011fi art\u0131rd\u0131\u011f\u0131 i\u00e7in \u00f6nerilen uygulama de\u011fildir. Her tablo i\u00e7in ayr\u0131 bir migration olu\u015fturmak daha iyi bir yakla\u015f\u0131md\u0131r.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel Migrations K\u0131lavuzu 2025: Veritaban\u0131 Y\u00f6netiminde Uzmanla\u015f\u0131n\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Laravel Migrations K\u0131lavuzu 2025: Veritaban\u0131 Y\u00f6netiminde Uzmanla\u015f\u0131n","description":"Evet, bir migration dosyas\u0131n\u0131n `up()` metodu i\u00e7inde birden fazla `Schema::create()` veya `Schema::table()` \u00e7a\u011fr\u0131s\u0131 yapabilirsiniz. Ancak, migration'lar\u0131n genellikle tek bir amaca hizmet etmesi, okunabilirli\u011fi ve y\u00f6netilebilirli\u011fi art\u0131rd\u0131\u011f\u0131 i\u00e7in \u00f6nerilen uygulama de\u011fildir. Her tablo i\u00e7in ayr\u0131 bir migration olu\u015fturmak daha iyi bir yakla\u015f\u0131md\u0131r.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/","og_locale":"tr_TR","og_type":"article","og_title":"Laravel Migrations K\u0131lavuzu 2025: Veritaban\u0131 Y\u00f6netiminde Uzmanla\u015f\u0131n","og_description":"Evet, bir migration dosyas\u0131n\u0131n `up()` metodu i\u00e7inde birden fazla `Schema::create()` veya `Schema::table()` \u00e7a\u011fr\u0131s\u0131 yapabilirsiniz. Ancak, migration'lar\u0131n genellikle tek bir amaca hizmet etmesi, okunabilirli\u011fi ve y\u00f6netilebilirli\u011fi art\u0131rd\u0131\u011f\u0131 i\u00e7in \u00f6nerilen uygulama de\u011fildir. Her tablo i\u00e7in ayr\u0131 bir migration olu\u015fturmak daha iyi bir yakla\u015f\u0131md\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-08T10:33:37+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Laravel Migrations K\u0131lavuzu 2025: Veritaban\u0131 Y\u00f6netiminde Uzmanla\u015f\u0131n","datePublished":"2025-10-08T10:33:37+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/"},"wordCount":3253,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PHP"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/","url":"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/","name":"Laravel Migrations K\u0131lavuzu 2025: Veritaban\u0131 Y\u00f6netiminde Uzmanla\u015f\u0131n","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-08T10:33:37+00:00","description":"Evet, bir migration dosyas\u0131n\u0131n `up()` metodu i\u00e7inde birden fazla `Schema::create()` veya `Schema::table()` \u00e7a\u011fr\u0131s\u0131 yapabilirsiniz. Ancak, migration'lar\u0131n genellikle tek bir amaca hizmet etmesi, okunabilirli\u011fi ve y\u00f6netilebilirli\u011fi art\u0131rd\u0131\u011f\u0131 i\u00e7in \u00f6nerilen uygulama de\u011fildir. Her tablo i\u00e7in ayr\u0131 bir migration olu\u015fturmak daha iyi bir yakla\u015f\u0131md\u0131r.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/laravel-migrations-kilavuzu-2025-veritabani-yonetiminde-uzmanlasin\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Laravel Migrations K\u0131lavuzu 2025: Veritaban\u0131 Y\u00f6netiminde Uzmanla\u015f\u0131n"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31310"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31310\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}