Laravel數據遷移及支持的數據類型

數據遷移

創建遷移

首先,讓我們創建一個MySql數據庫“Laravel_db”。接下來打開app/config目錄下的database.php文件。請確保default鍵值是mysql:

return array(
        ...
        'default' => 'mysql',

然后輸入你的數據庫配置信息:(可以用上.env 文件輔助)

...
'connections' => array(
        'mysql' => array(
                'driver'    => 'mysql',
                'host'      => '127.0.0.1',
                'database'  => 'laravel_db', //數據庫名
                'username'  => 'root, //你的數據庫用戶
                'password'  => 'Your_Database_Password', //數據庫登錄密碼
                'charset'   => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix'    => '',
        ),
...

我們要使用Laravel命令行工具artisan來創建我們新的遷移。要運行astisan需要打開一個終端,切換路徑到Laravel引用程序文件夾的更目錄。

第一個我們需要做的就是安裝migrations表,這樣Laravel就可以追蹤哪些遷移已經運行了。下面的命令將會在數據庫中創建一個特殊的表:

php artisan migrate:install
數據遷移表示例

如果創建成功,artisan會返回“Migration table created successfully.”。

查看數據庫,你會發現artisan確實創建了一個新表“migrations”。

你不需要過于關注這個表。這只是一個幫助Laravel監視遷移的表。當你添加新的遷移,artisan migrate會檢查migrations表并執行那些沒有運行的遷移。

現在,讓我們創建一個實際的遷移文件。我想創建一個名為“author”的新表。讓我們運行artisan migrate:make命令:

php artisan migrate:make create_authors_table
創建數據遷移

你會在app/database/migrations目錄下看到文件2014_03_11_162133_create_authors_table.php。

正如你看到的,一個新的遷移文件名稱中包含時間戳和遷移的描述性名稱。

遷移的解剖

遷移是Illuminate\Database\Migrations\MigrationLaravel 類的子類。您創建的類必須至少包含類的兩個方法up()和down()。下面是生成由artisan的骨架遷移類:

<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAuthorsTable extends Migration {

    public function up()
    {
        //
    }

    public function down()
    {
        //
    }
}

使用Laravel,我們可以在任何時間遷移到數據模型的特定版本。Up()方法中的代碼執行向前遷移,down()執行反向遷移(創建數據庫的新版本或者回滾到前一個版本)。

很容易想到up()執行遷移文件操作,down()是完全相反。就像word文檔中的撤銷命令——撤銷所做的修改。例如,我們想創建一個“authors”表,在up()中創建,在down()中撤銷。讓我們看看應該怎么做。

Artisan migrate:make命令有一些可以加快你工作流的其他選項。讓我們運行下面命令:

php artisan migrate:make create_authors_table --table authors --create

在上面的例子中,我們使用—table選項指定表名。另外,我添加了—create選項去告知artisan這個表需要被創建。如果我們打開遷移文件,你會發現artisan為我們生成了額外的樣板文件代碼:

<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAuthorsTable extends Migration {

    public function up()
    {
        Schema::table('authors', function(Blueprint $table)
        {
            //
        });
    }

    public function down()
    {
        Schema::table('authors', function(Blueprint $table)
        {
            //
        });
    }
}

非常棒!現在,讓我們做更加具體的工作。我們要使用的 Laravel Schema類來創建我們的"Authors"表。下面是創建作者表,并將必要的列添加到表的遷移代碼:

public function up()
{
     Schema::create('authors', function(Blueprint $table)
    {
            // auto increment id (primary key)
            $table->increments('id');

            $table->string('name');
            $table->integer('age')->nullable();
            $table->boolean('active')->default(1);
            $table->integer('role_id')->unsigned();
            $table->text('bio');

            // created_at, updated_at DATETIME
            $table->timestamps();
      });
}

我們調用Schema::create()方法創建一個新表“authors”。Schema::create()方法有兩個參數:表名和一個閉包,閉包中包含了列定義。

閉包中,我們可以使用$table參數創建列。列定義方法的基本結構是:

$table->column_type(column_name)

列類型

在前面的示例中,我們指定的名稱列的類型為"string"。但這是什么意思?數據庫中通常沒有”string”類型的列。

請記住,Laravel 試圖使您的應用程序獨立于底層的數據庫;例如,如果你想,你可以使用 MySql 開發并部署到 Postgresql。如果您在遷移中使用 MySql 的列類型,應用到 Postgres 數據庫可能無法工作。所以,Laravel 遷移通過使用通用的數據類型使你與底層的數據庫類型系統隔離。如果我們要遷移 MySql 數據庫, string()方法將創建VARCHAR(255)類型的列。在 Postgres,同一遷移可能會添加CHAR VARYING(255)類型的列 (雖然VARCHAR類型支持所有主要的數據庫平臺)。

Laravel 直接支持以下數據類型:

Laravel 方法 列的類型
increments($column) 向表中添加自動遞增的主鍵
string($column) 添加一個VARCHAR(255)列
string($column, $length) 添加具有長度的VARCHAR
integer($column) 向表中添加一個INTEGER列
float($column) 向表中添加一個FLOAT的列
decimal($column, $precision, $scale) 添加一個DECIMAL列的精度和小數位數。精度是總數中數字的位數。規模是小數點的右側的位數。例如,數 123.45 具有精度為 5 和 2 的小數。從邏輯上講,規模不能大于精度。
boolean($column) 向表中添加一個BOOLEAN的列。注意: 存儲布爾值的方式而有所不同從一個數據庫到另一個數據庫。一些使用"1"和"0"的整數值來表示 true 和 false,個別的,其他人使用"T"和"F"等字符。Laravel 的"boolean"類型映射到數據庫的所有系統上的small integer列。Laravel 很好的處理 PHP 的true與false之間的映射,所以你不需要擔心。
text($column) 相當于表的TEXT
blob($column) 相當于表的BLOB
binary($column) 相當于表的BINARY
dateTime($column) 相當于表DATETIME
timestamp($column) 相當于表TIMESTAMP
date($column) 相當于表的DATE
time($column) 相當于表的TIME
enum($column, array $allowed) 在表上創建一個新的ENUM列

此外,還有幾個你需要知道的擴展方法:

Laravel 方法 列的類型
timestamps() timestamps()與timestamp()不同。它是一個 Laravel 用來管理創建和修改作為created_at和updated_at TIMESTAMP列的便利方法。他們是 Laravel 可以自己修改的兩個特殊的數據庫列。created_at列為僅當行被創建時當前時間戳。另一方面, updated_at被修改為每次操作的行的數據時當前時間戳。
nullable() 將指定列允許NULL值。默認情況下,Laravel 使在數據庫級別需要通過添加NOT NULL約束的列。
default($value) 設置要用于新行作為初始值的列的默認值。你永遠不需要顯式設置的默認值為 null。不設置它默認值就為null。
unsigned() 設置INTEGER列為UNSIGNED。

現在支持的鏈式操作
protected $modifiers = array('Unsigned', 'Nullable', 'Default', 'Increment', 'After', 'Comment');


參考網址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容