Laravel 學習筆記(18) - 資料庫之 Migrations & Seeding

Migrations & Seeding

Laravel 官網上的說明,Migrations 是一種資料庫版本控制的型式。它可以讓開發團隊在修改資料庫綱要(schema)時仍保持最新的狀態。Migrations 通常會使用 Schema Builder 來管理。

在終端機中,進入網站目錄,輸入指令:php artisan migrate:make create_users_table 會產生類似 app/database/migrations/2014_12_11_081527_create_posts_table.php 這樣的檔案。前面會加上日期及時間戳記,時間戳記在每次執行指令時都會不同。也就是說,之後在執行 migrate 動作時,它是會依序執行的。如果你有要調動執行的順序,只要改前面的日期,或時間戳記,就能改變被執行的順序。

Migrations

執行 Migrations

在終端機輸入指令:php artisan migrate migrate 會將 app/database/migrations 目錄下的所有 migrations 檔全部執行一遍,而且它會記得上次執行的 migrate 動作。例如:你今天新增了 3 個 migrations 檔,並且執行過 migrate 的動作。當你隔天又加入新的 migrations 檔時,它只會對新的檔案動作,所以在紀錄中,你總共執行過兩次 migrate 的動作。

回復(rollback)上一次的 Migrate 動作

指令:php artisan migrate:rollback
因為是還原上一次的動作,如果想要還原到最初,就必須重覆執行,直到它告訴你沒有動作可以還原了。

或是你也可以執行:php artisan migrate:reset 一次還原所有 migrate 的動作。

如果要全部還原,並同時重做一次 migrate,可以執行:
php artisan migrate:refresh
動作等於 migrate:reset 加上 migrate,簡直就是懶人的天堂XD。

!重要:你很可能在執行 migrate 指令時會遇到 "class not found" 的錯誤,很正常,因為有可能新增了類別但 artisan 不知道 (也就是前面建立的 2014_12_11_081527_create_posts_table.php)。
要解決這個問題,可以執行指令:php artisan dump-autoload 來載入這個新建的類別,這個指令還滿常用的,有時候新建 controller 後也會用到。

Seeding

建立 Seeding

有時候我們會需要預先建立一些假資料來測試,這時候利用 Laravel 提供的 Seeding 功能,非常方便就能完成。

這些 seeding 檔存放在 app/database/seeds 目錄中,seeding 檔的命名沒有強制規定。

在 seeds 目錄中己經有一個 DatabaseSeeder.php 檔,你可以在這個檔案中使用 call() 方法去呼叫你建立的 seeding 檔,它會依你呼叫的順序執行。

現在,新增一個 PostTableSeeder.php 檔:
<?php

class PostTableSeeder extends Seeder {

    public function run()
    {
        DB::table('posts')->delete();
        Post::create(['title' => 'Hello!!!', 'content' => 'Laravel~~~']);
    }

}
run() 裡面的第一行,通常會先把已存在的資料全部刪除,如果你不這麼做,資料將會一直增加。

接著在 DatabaseSeeder.php 檔的 run() 中加入:
$this->call('PostTableSeeder');
這樣當 DatabaseSeeder 被執行時,就會去呼叫我們的 PostTableSeeder。

當你把所有的 XxxSeeder 檔都建好後,就可以執行指令:php artisan db:seed
你可以在 call() 方法之後加上:
$this->command->info('Post table seeded!');
這樣會在終端機顯示你所輸入的文字 Post table seeded!,告訴執行指令的人這個 seed 動作已完成。

預設 db:seed 指令會去執行 DatabaseSeeder 類別,然後由它去呼叫其他的 Seeder,如果你想直接執行某個 Seeder,指令中可以加上想執行的類別: php artisan db:seed --class=PostTableSeeder
前面提到的 migrate:refresh 可以再加上 seed 參數,達到重置資料表並同時新增 seed 的動作 php artisan migrate:refresh --seed

註:如果你在執行 seed 指令的時候出現錯誤:
[Illuminate\Database\Eloquent\MassAssignmentException]
title
這是說你無法對該欄位(這裡顯示 'title')做大量指派,因為我們使用 Post::create() 方法,會觸發大量指派的檢查。在 Eloquent ORM 這節我們有提到,如果要對某欄位大量指派,必須設定 fillable 欄位。

所以記得在 app/models/Post.php 加入:
protected $fillable = ['title', 'content'];

Fake Data

看起很真的假資料

利用 Faker 可以建立以假亂真的資料,省得老是為了輸入假資料而煩惱。不過目前只有英文內容。

安裝 Faker

首先要在你的專案中安裝 Faker。開啟專案(網站)中的 composer.json 檔,加入:
"require-dev": {
  "fzaninotto/faker": "1.5.*@dev"
}
你可以在最後一個項目後面加上逗號,之後再貼上上面這段程式碼。接著在終端機輸入指令:composer update要等一段時間更新。

使用 Faker

開啟 app/database/seeds/PostTableSeeder.php,先引入 Faker 的命名空間,寫在 class 前面:
<?php
use Faker\Factory as Faker;
class PostTableSeeder extends Seeder {
//略⋯⋯
之後我們用到的 Faker 就是指 Faker\Factory 。現在將原本 Post::create() 這行改為:
$faker = Faker::create();

for ($i=0; $i < 10; $i++) {
    Post::create(['title' => $faker->sentence, 'content' => $faker->text]);
}
使用 for 迴圈來建立 10 筆資料,$faker->sentence 會產生一段句子。$faker->text 會產生一段比較長的文字。

Faker 更多的資料格式,可以參考 GitHub 的 fzaninotto/Faker
,有人名、地址、電話、mail、網址、公司名稱、日期時間,連信用卡、顏色、檔案、圖片等等都有。

現在可以執行 seed 指令來看看加入的假資料看起來如何。
本文網址:http://blog.tonycube.com/2015/01/laravel-18-migrations-seeding.html
Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。