佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > Laravel框架數(shù)據(jù)庫遷移操作實(shí)例詳解

Laravel框架數(shù)據(jù)庫遷移操作實(shí)例詳解

熱門標(biāo)簽:服務(wù)器配置 銀行業(yè)務(wù) 團(tuán)購網(wǎng)站 電子圍欄 Linux服務(wù)器 科大訊飛語音識(shí)別系統(tǒng) 阿里云 Mysql連接數(shù)設(shè)置

很多人可能在學(xué)習(xí)Laravel框架的時(shí)候,對(duì)Laravel的數(shù)據(jù)庫遷移(以下簡稱Migrations)存在著疑惑:

1. 什么是 Migrations?

2. 為什么要用 Migrations?

3. Migrations 到底方便在哪里?

好了,抱著這些問題,我們今天就一起來學(xué)習(xí)Migrations。

什么是 Migrations?

我們先來看一下Laravel官方文檔怎么寫的:

Migrations are like version control for your database, allowing your team to easily modify and share the application's database schema. Migrations are typically paired with Laravel's schema builder to easily build your application's database schema. If you have ever had to tell a teammate to manually add a column to their local database schema, you've faced the problem that database migrations solve.

簡單概括起來,就是我們可以將Migrations看作一種數(shù)據(jù)庫的VCS(Version Control System),即版本控制系統(tǒng)。

可以通過Laravel的artisan命令快速創(chuàng)建、修改或還原數(shù)據(jù)庫結(jié)構(gòu)。

為什么要用 Migrations?

使用Migrations可以有效地對(duì)數(shù)據(jù)庫進(jìn)行版本控制,并且遵從了Single Responsibility Principle(單一職責(zé)原則),更加方便數(shù)據(jù)庫的操控。

舉個(gè)例子來說,假設(shè)我們已經(jīng)設(shè)計(jì)并創(chuàng)建好了數(shù)據(jù)庫,數(shù)據(jù)已經(jīng)填充進(jìn)數(shù)據(jù)庫了,現(xiàn)在我們發(fā)現(xiàn)需要在其中一張表里增加一個(gè)名為name的欄目(column),需要在另一張表中將author欄目的名字改為user,那么我現(xiàn)在進(jìn)入數(shù)據(jù)庫里,進(jìn)行了操作。剛剛操作完,公司老板突然找我面談。面談完了之后,我忘記了將我在數(shù)據(jù)庫里的操作記錄下來或者告知給其他開發(fā)人員,那么隨之而來的很可能是災(zāi)難性的結(jié)果。

如果我們使用了Migrations,并且只通過Migrations進(jìn)行數(shù)據(jù)庫的操作,那么所有開發(fā)人員都可以看到數(shù)據(jù)庫進(jìn)行了哪些操作,而不會(huì)發(fā)生上述的情況。

Migrations 到底方便在哪里?

除了上述提到的版本控制功能外,我們幾乎不需要寫SQL代碼就能簡單快速地組建起數(shù)據(jù)庫結(jié)構(gòu),并且可以迅速遷移(migrate)或者回滾(Rollback),省去了大量人工操作的繁瑣。

講解完了概念,我們現(xiàn)在來看一下具體怎么使用Migrations。

要?jiǎng)?chuàng)建一個(gè)遷移文件,我們可以用以下artisan命令:

$ php artisan make:migration create_samples_table --create=samples

注意php artisan命令需要在項(xiàng)目根目錄下運(yùn)行。--create==samples這個(gè)選項(xiàng)表明我們想要建立一個(gè)名為samples的數(shù)據(jù)庫表,所以artisan會(huì)自動(dòng)在database\migrations目錄下建立一個(gè)叫2017_03_13_061422_create_samples_table.php的文件(其中前綴是創(chuàng)建該文件的日期和時(shí)間,用于區(qū)分遷移文件的時(shí)間先后順序),并且會(huì)自動(dòng)填充好Schema::create這個(gè)方法,方便我們創(chuàng)建更多的column:

?php        
  
use Illuminate\Support\Facades\Schema;        
use Illuminate\Database\Schema\Blueprint;        
use Illuminate\Database\Migrations\Migration;        
  
class CreateSamplesTable extends Migration        
{        
  /**        
   * Run the migrations.        
   *        
   * @return void        
   */        
  public function up()        
  {        
    Schema::create('samples', function (Blueprint $table) {        
      $table->increments('id');        
      $table->timestamps();        
    });        
  }        
  
  /**        
   * Reverse the migrations.        
   *        
   * @return void        
   */        
  public function down()        
  {        
    Schema::dropIfExists('samples');        
  }        
}

我們看到,這個(gè)類中有up和down兩個(gè)方法。up中我們需要添加創(chuàng)建數(shù)據(jù)表的函數(shù),以及添加各個(gè)欄目的名稱及屬性。而down方法中我們需要添加在回滾該遷移文件時(shí)應(yīng)該有什么樣的結(jié)果(這里我們直接刪除這張表)。

可以看出,up和down中的操作是對(duì)應(yīng)的,在up中進(jìn)行了什么操作,down中就需要撤銷這些操作。

現(xiàn)在我們?cè)敿?xì)來看一下up方法。我們看到,Schema::create這個(gè)方法是用來創(chuàng)建我們數(shù)據(jù)表的,在方法中,我們看到Laravel已經(jīng)為我們填充了幾個(gè)columns。

$table->increments('id')將創(chuàng)建一個(gè)名為id的column,并賦予PRIMARY KEY、UNSIGNED及AUTO INCREMENT屬性。

$table->timestamps()將創(chuàng)建created_at和updated_at兩個(gè)column(類型是DATETIME)。

注意:Laravel默認(rèn)認(rèn)為每個(gè)table都會(huì)存在一個(gè)id欄目,并且要求每個(gè)table都要有created_at和updated_at這兩個(gè)欄目。

現(xiàn)在,我們要在samples表里增加一個(gè)名為name的VARCHAR類型的欄目,該怎么做呢?

很簡單,只需要加上這行:

$table->string('name');

如果我們想限制VARCHAR的長度,可以在第二個(gè)參數(shù)中進(jìn)行注明:

$table->string('name', 100);

好了,我們暫時(shí)就只需要這些欄目?,F(xiàn)在我們已經(jīng)有了遷移文件了,怎么樣才能在數(shù)據(jù)庫里建立起我們的表呢?

很簡單,輸入

$ php artisan migrate

等待命令完成就可以了。

現(xiàn)在我們?cè)跀?shù)據(jù)庫里,就能看到我們的samples表了。

注意:運(yùn)行php artisan migrate之前請(qǐng)檢查你的.env文件中DB_DATABASE,DB_USERNAME,DB_PASSWORD 幾項(xiàng)配置是否正確。如果你在Homestead下進(jìn)行Laravel開發(fā),那么DB_USERNAME默認(rèn)為homestead,DB_PASSWORD默認(rèn)為secret,DB_DATABASE請(qǐng)根據(jù)你的項(xiàng)目具體填入你的數(shù)據(jù)庫名稱。

現(xiàn)在問題來了,我們突然想在samples表里,添加一個(gè)名為url的欄目,該怎么做呢?我們分情況討論。

1. 我們處于本地開發(fā)階段,數(shù)據(jù)使用種子(Seed)文件進(jìn)行填充。

對(duì)于本地開發(fā),如果想省事,可以直接在samples表的遷移文件中,添加上我們需要的欄目:

$table->string('url', 200)->nullable();

然后我們重置數(shù)據(jù)庫并做種:

$ php artisan migrate:refresh --seed

這樣就完成了。打開samples表,我們會(huì)發(fā)現(xiàn)新的欄目已經(jīng)被創(chuàng)建。

注意,php artisan migrate:refresh命令相當(dāng)于

$ php artisan migrate:reset       

$ php artisan migrate

所以我們經(jīng)常會(huì)使用到。

2. 另一種情況,我們需要詳細(xì)記錄每一個(gè)數(shù)據(jù)庫操作,例如在production環(huán)境下進(jìn)行數(shù)據(jù)庫修改。

首先我們需要添加一個(gè)package:

$ composer require doctrine/dbal

要進(jìn)行表的修改必須添加以上包裹。

完成后我們需要?jiǎng)?chuàng)建一個(gè)新的遷移文件:

$ php artisan make:migration add_url_field_to_samples_table --table=samples

我們想要添加一個(gè)url欄目,并且讓它在name之后,我們?cè)赟chema::table函數(shù)中填入以下代碼:

?php      
  
use Illuminate\Support\Facades\Schema;      
use Illuminate\Database\Schema\Blueprint;      
use Illuminate\Database\Migrations\Migration;      
  
class ModifySamplesTable extends Migration      
{      
  /**      
   * Run the migrations.      
   *      
   * @return void      
   */      
  public function up()      
  {      
    Schema::table('samples', function (Blueprint $table) {      
      $table->string('url', 200)->after('name');   
    });      
  }      
  
  /**      
   * Reverse the migrations.      
   *      
   * @return void      
   */      
  public function down()      
  {      
    Schema::table('samples', function (Blueprint $table) {      
      $table->dropColumn('url');     
    });      
  }      
}

完成后,我們運(yùn)行migrate:

$ php artisan migrate

這樣,url就被添加進(jìn)了sample表中,并且位置處于name之后。

我們?cè)趕amples表中插入了新的url欄目,那么現(xiàn)在如果我們想把name這個(gè)欄目長度限制從100修改為50,該怎么做呢?

同理,我們需要先創(chuàng)建一個(gè)migration:

$ php artisan make:migration modify_name_column_in_samples_table --table=samples

在migration文件中,我們添加以下代碼:

?php      
  
use Illuminate\Support\Facades\Schema;      
use Illuminate\Database\Schema\Blueprint;      
use Illuminate\Database\Migrations\Migration;      
  
class ModifyNameColumnInSamplesTable extends Migration      
{      
  /**      
   * Run the migrations.      
   *      
   * @return void      
   */      
  public function up()      
  {      
    Schema::table('samples', function (Blueprint $table) {      
      $table->string('name', 50)->change();       
    });      
  }      
  
  /**      
   * Reverse the migrations.      
   *      
   * @return void      
   */      
  public function down()      
  {      
    Schema::table('samples', function (Blueprint $table) {      
      $table->string('name', 100)->change();      
    });      
  }      
}

完成后,我們?cè)俅芜\(yùn)行migrate:

$ php artisan migrate

這樣一來就完成了欄目的修改,非常的直觀。

注意:如果我們想把某個(gè)欄目改成其他類型,可以采用以下語法

$table->text('name')->change();

完成之后,再次運(yùn)行php artisan migrate,我們就可以看到name已經(jīng)從VARCHAR變?yōu)榱薚EXT類型了。

好了,本文主要講解了Laravel框架中數(shù)據(jù)庫遷移操作的方法實(shí)例,更多關(guān)于Laravel框架的使用技巧請(qǐng)查看下面的相關(guān)鏈接

您可能感興趣的文章:
  • Laravel源碼解析之路由的使用和示例詳解
  • 通過源碼解析Laravel的依賴注入
  • 源碼分析 Laravel 重復(fù)執(zhí)行同一個(gè)隊(duì)列任務(wù)的原因
  • Laravel 框架控制器 Controller原理與用法實(shí)例分析
  • Laravel 框架路由原理與路由訪問實(shí)例分析
  • 4種Windows系統(tǒng)下Laravel框架的開發(fā)環(huán)境安裝及部署方法詳解
  • Laravel框架下的Contracts契約詳解
  • laravel框架路由分組,中間件,命名空間,子域名,路由前綴實(shí)例分析
  • laravel框架使用FormRequest進(jìn)行表單驗(yàn)證,驗(yàn)證異常返回JSON操作示例
  • Laravel框架源碼解析之反射的使用詳解

標(biāo)簽:萍鄉(xiāng) 大理 江蘇 蚌埠 廣元 衢州 棗莊 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Laravel框架數(shù)據(jù)庫遷移操作實(shí)例詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    安平县| 崇左市| 万安县| 彰化市| 曲麻莱县| 广安市| 望江县| 南汇区| 莲花县| 永顺县| 石台县| 安新县| 荔浦县| 南澳县| 南宫市| 休宁县| 资阳市| 龙胜| 额济纳旗| 合川市| 兴义市| 稻城县| 梧州市| 瓮安县| 巧家县| 临海市| 黄浦区| 布尔津县| 广宗县| 昂仁县| 广汉市| 建平县| 蒙自县| 孟州市| 临西县| 甘洛县| 太康县| 钦州市| 博乐市| 文安县| 朝阳市|