最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年04月06日 15:00:24   作者:Eagle L.  
這篇文章主要介紹了Laravel框架數(shù)據(jù)庫遷移操作實(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)在我們詳細(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)在我們在數(shù)據(jù)庫里,就能看到我們的samples表了。

注意:運(yùn)行php artisan migrate之前請檢查你的.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請根據(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之后,我們在Schema::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之后。

我們在samples表中插入了新的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();      
    });      
  }      
}

完成后,我們再次運(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框架的使用技巧請查看下面的相關(guān)鏈接

相關(guān)文章

  • PHP7內(nèi)核之Reference詳解

    PHP7內(nèi)核之Reference詳解

    這篇文章主要介紹了PHP7內(nèi)核之Reference,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • PHP使用CURL模擬登錄的方法

    PHP使用CURL模擬登錄的方法

    本文給大家介紹的是PHP使用CURL模擬登錄的方法,思路和其他模擬登陸的程序不同,有需要的小伙伴可以詳細(xì)看下。
    2015-07-07
  • php實(shí)現(xiàn)的zip文件內(nèi)容比較類

    php實(shí)現(xiàn)的zip文件內(nèi)容比較類

    這篇文章主要介紹了php實(shí)現(xiàn)的zip文件內(nèi)容比較類及其用法,可實(shí)現(xiàn)比較兩個(gè)zip文件的內(nèi)容,返回新增、刪除、及相同的文件列表,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-09-09
  • php實(shí)現(xiàn)JWT驗(yàn)證的實(shí)例教程

    php實(shí)現(xiàn)JWT驗(yàn)證的實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于php實(shí)現(xiàn)JWT驗(yàn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • PHP獲取二叉樹鏡像的方法

    PHP獲取二叉樹鏡像的方法

    這篇文章主要介紹了PHP獲取二叉樹鏡像的方法,涉及php使用隊(duì)列針對(duì)二叉樹進(jìn)行翻轉(zhuǎn)的相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • PHP 輸出簡單動(dòng)態(tài)WAP頁面

    PHP 輸出簡單動(dòng)態(tài)WAP頁面

    首先,不管你是在本地調(diào)試還是想瀏覽網(wǎng)絡(luò)上的wap頁面,都需要一個(gè)能解析wap頁面的瀏覽器
    2009-06-06
  • php addslashes和mysql_real_escape_string

    php addslashes和mysql_real_escape_string

    本文介紹的是用 mysql_real_escape_string對(duì)用戶提交數(shù)據(jù)進(jìn)行整理處理和通過addslashes以及mysql_escape_string這3個(gè)類似的功能函數(shù)的區(qū)別。經(jīng)過轉(zhuǎn)義的數(shù)據(jù)可以直接插入到數(shù)據(jù)庫中。
    2010-01-01
  • PHP可逆加密/解密函數(shù)分享

    PHP可逆加密/解密函數(shù)分享

    很多項(xiàng)目的會(huì)員系統(tǒng),都要求要有記住登錄功能,在通過cookies實(shí)現(xiàn)功能是,由于要將客戶信息直接保存到cookies,如果直接寫入cookies勢必會(huì)帶來安全隱患,因此通過可逆加密后再保存到cookies相對(duì)就安全了
    2012-09-09
  • php實(shí)現(xiàn)圖片上傳并進(jìn)行替換操作

    php實(shí)現(xiàn)圖片上傳并進(jìn)行替換操作

    這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)圖片上傳并進(jìn)行替換操作,講解的很詳細(xì),通俗易懂,感興趣的小伙伴們可以參考一下
    2016-03-03
  • PHP結(jié)構(gòu)型模式之裝飾器模式

    PHP結(jié)構(gòu)型模式之裝飾器模式

    這篇文章主要介紹了PHP結(jié)構(gòu)型模式之裝飾器模式,裝飾器模式是一種結(jié)構(gòu)型模式,它允許你在運(yùn)行時(shí)為一個(gè)對(duì)象動(dòng)態(tài)地添加新的行為,而不影響其原始的行為。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它結(jié)合了透明性和多樣性
    2023-04-04

最新評(píng)論

山东省| 和平县| 孝感市| 会昌县| 蓝山县| 喀喇| 开鲁县| 繁昌县| 虎林市| 邻水| 馆陶县| 城口县| 康马县| 新化县| 扎兰屯市| 西华县| 鹤庆县| 福清市| 巴里| 岑溪市| 鹿邑县| 巍山| 大庆市| 读书| 股票| 老河口市| 北碚区| 徐州市| 西吉县| 钦州市| 平乐县| 丰城市| 甘泉县| 麻阳| 洛川县| 南陵县| 民权县| 惠州市| 韩城市| 潢川县| 禹城市|