# Migration
這裏會介紹如何在 Laravel 5 使用 Migration 管理資料庫
### Migration 指令
### 建立 Migration
~~~
$ php artisan make:migration create_users_table --create="users"
~~~
Migration 建立之後的檔案會放在 `database/migrations/2015_04_11_134630_create_users_table.php`
> Migration 檔案最前面的日期會依照你建立 Migration 的時間自動產生,所以每個人看到的檔名皆會不同在後面加了 `--create` 的參數可以告訴 Migration,我們要做建立 `user` 資料表的動作,檔案內容會像這樣:
~~~
<?php
// database/migrations/2015_04_11_134630_create_users_table.php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/ㄒ
public function up()
{
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->timestamp();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('users');
}
}
~~~
### 異動資料表欄位資料
如果我們要在 `users` 資料表中加欄位(或是其他改變資料表結構),我們可以用這樣的指令去建立 Migration
~~~
$ php artisan make:migration add_email_to_users_table --table="users"
~~~
> 在後面加了 `--table` 的參數可以告訴 Migration,我們要做異動 `user` 資料表的動作,檔案內容會像這樣:
~~~
<?php
// database/migrations/2015_04_12_154720_add_email_to_users_table.php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddEmailToUsersTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function(Blueprint $table)
{
$table->string('email', 180);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function(Blueprint $table)
{
$table->dropColumn('email');
});
}
}
~~~
> 原先的建立資料表會用 `Schema::create()`,而異動資料表則會用 `Schema::table()` 去做異動
### 列出目前所有 Migration 狀態
~~~
$ php artisan migrate:status
~~~
### 執行 Migration
~~~
$ php artisan migrate
~~~
### 恢復上一版本的 Migration
~~~
$ php artisan migrate:rollback
~~~
### 清除所有版本的 Migration
~~~
$ php artisan migrate:reset
~~~
### 清除所有版本的 Migration 並重新執行
~~~
$ php artisan migrate:refresh
~~~
### 備註
### 欄位異動
若做欄位異動 Migration 後需要 rollback,若丟出例外錯誤時,則使用 composer 安裝 `doctrine/dbal` 後即可解決 rollback 的問題
~~~
$ composer require doctrine/dbal
~~~
### 安全性
在剛開始開發產品的時候,有時候資料表有做小小的修改或異動,為了圖方便,我們常常會使用 `migrate:reset` 或 `migrate:refresh` 去清空我們的資料,重建資料表。
但如果產品已經上線了,這個指令就會是一個非常危險的指令,企業產品最重要的資產就是`資料`,這個指令會導致所有的資料都被清除,所以請上線後小心謹慎去使用。
### 參考資料
- [遷移和資料填充 - Laravel.tw](http://laravel.tw/docs/5.0/migrations)
- [Migrations - Laracasts](https://laracasts.com/series/laravel-5-fundamentals/episodes/7)
- 介紹
- 環境
- .env 檔案
- 資料庫
- Migration (遷移)
- Eloquent Model (模型)
- 設定
- 關聯
- 魔術函式
- 使用 Eloquent
- 常見問題
- 無法取得查詢 Log
- 使用大量資料的方式新增時無法新增
- 使用中繼模型繼承 Eloquent 模型造成無法使用大量資料新增
- PostgreSQL
- 安裝 PostgreSQL ODBC driver
- HTTP
- 請求
- 中介層 (Middleware)
- 視圖 (View)
- 服務
- 認證登入(Auth)
- 郵件(Mail)
- 使用 Gmail 寄信
- 使用 Mailgun 寄信
- 隊列(Queue)
- database
- 非同步(async)
- 輔助方法 (Helpers)
- 自定義輔助方法
- 單元測試 (Unit Test)
- Post CSRF 錯誤
- 錯誤與日誌
- 在單元測試顯示例外
- 日誌記錄層級
- 日誌巨集
- 加密
- 雜湊
- Elixir
- 使用 Elixir 合併 CSS 與 JS
- 設計模式
- 服務容器
- PSR
- Model 模型
- 學習資源
- 套件
- Debug
- Artisan tail
- 工具
- Carbon
- 設計模式
- 其他常見問題
- Call to undefined method getCachedCompilePath()
- 變更專案目錄名稱導致 View 無法讀取
- Laravel 5.1 目錄結構異動
- 學習資源
- 官方
- 社群
- 會議議程
- 工作
- 文件
- 文章
- 套件
- 服務工具
- 教學影片
- 教學網站
- 編輯開發
- 主機
- 成功案例