iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 20
1
Modern Web

Laravel從入門到放棄…………原生PHP (疑?系列 第 19

[Day 19] Laravel實作 - 資料庫設定及建立(四)

接下來要談談如何建立Migration檔案

建立自定義Migration檔案

初窺artisan

現在許多的現代框架,提供你使用指令的方式去與框架作互動,而Laravel提供了artisan命令列指令讓我們與Laravel作互動,在專案的根目錄你會看到一個artisan的檔案,這是一個PHP的執行檔,所以我們可以直接在專案根目錄下輸入php artisan指令,就可以列出所有artisan提供的指令了。
https://ithelp.ithome.com.tw/upload/images/20190930/20105694yDxptulWZ8.png

在專案根目錄下輸入php artisan指令,會看到make指令集有一個make:migration以及其他migrate的相關指令,這個是Laravel artisan提供給我們直接使用artisan建立新的migration檔案使用,接下來要用這個指令來建立我們第一個migration檔案了
php artisan
好像需要PHP 7.1以上才能使用
https://ithelp.ithome.com.tw/upload/images/20190930/20105694vYPBa6Wvoy.png

使用artisan指令建立migration檔案

除了使用者資料表外,我們還要商品(merchandise)及交易(transaction)這兩個資料表,所以可以使用php artisan make:migration來建立這兩個資料表的migration檔案,指令像是下面的樣子

  • 建立商品資料表檔案
    php artisan make:migration create_merchandise_table --create=merchandise
    https://ithelp.ithome.com.tw/upload/images/20190930/201056940Sh1n5NaG0.png

  • 建立交易紀錄資料表檔案
    php artisan make:migration create_transaction_table --create=transaction
    https://ithelp.ithome.com.tw/upload/images/20190930/20105694BqwC4ssRsh.png

  • 加入生日欄位到使用者資料表的檔案
    php artisan make:migration add_birthday_to_user_table --table=user
    https://ithelp.ithome.com.tw/upload/images/20190930/20105694jJkK3GLbEk.png

在php artisan make:migration後面接的第一個參數會是migration檔案名稱,像是create_merchandise_table,通常我們會用來描述此次資料庫異動的行為是什麼,這樣之後就可以很容易地從檔名,了解這次做了什麼資料庫異動。而後面的--create參數是要求artisan幫我們預先在檔案中填入Schema::create('資料表名稱'); 的程式,若使用--table參數的話,則是會填入Schema::table('資料表名稱'),讓我們可以對資料表做異動

Migration檔案的名稱會依照 西元年_月_日_時間_指定檔案名稱 去做命名,當Migration在執行時,則會依照檔案名稱的時間日期,依序去做資料表的建立或異動。
https://ithelp.ithome.com.tw/upload/images/20190930/201056949wqyVhq3GD.png

在我們剛剛建立的商品資料表的Migration 2019_09_30_005953_create_merchandise_table.php 檔案中,可以看到artisan幫我們建立檔案中有使用Schema::create()靜態方法,幫我們預先填入資料表欄位,而同樣預設資料表欄位結構的程式,也可以在交易記錄資料表的Migration 2019_09_30_010205_create_transaction_table.php 檔案中看到
2019_09_30_005953_create_merchandise_table.php

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateMerchandiseTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('merchandise', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('merchandise');
    }
}

設計migration檔案

接下來我們可以針對先前設計的商品資料表(merchandise)即交易記錄資料表(transaction)欄位結構設計我們的migration檔案

商品資料表

商品資料表(merchandise)欄位設計

說明 欄位名稱 欄位屬性
商品編號 id Integer
商品狀態 status Varchar(1)
商品名稱 name Varchar(80)
商品英文名稱 name_en Varchar(80)
商品介紹 introduction Text
商品英文介紹 introduction_en Text
商品照片 photo Varchar(50)
價格 price Integer
商品剩餘數量 remain_count Integer
建立時間 created_at Datetime
更新時間 updated_at Datetime

商品資料表(merchandise)的Migration

database\migrations\ 2019_08_16_083840_create_merchandise_table.php

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateMerchandiseTable extends Migration
{
    //執行資料庫異動
    public function up()
    {
        Schema::create('merchandise', function (Blueprint $table) {
            //商品編號
            $table->bigIncrements('id');
            //用於標記商品狀態,已上架的商品才能被消費者看到
            // -C (Create) : 建立中
            // -S (Sell) : 可販售
            $table->string('status', 1)->default('C');
            //商品名稱
            $table->string('name', 80)->nullable();
            //商品英文名稱
            $table->string('name_en', 80)->nullable();
            //商品介紹
            $table->text('introduction');
            //商品英文介紹
            $table->text('introduction_en');
            //商品照片
            $table->string('photo', 50)->nullable();
            //價格
            $table->integer('price')->default(0);
            //商品剩餘數量
            $table->integer('remain_count')->default(0);
            //時間戳記
            $table->timestamps();

            //索引設定
            $table->index(['status'], 'merchandise_status_idx');
        });
    }

    //復原資料庫異動
    public function down()
    {
        Schema::dropIfExists('merchandise');
    }
}

商品資料表會看澳有將商品名稱設定為允許空值nullable(),這是因為當管理者按下建立商品時,我們要讓管理者可以立即上傳商品圖片,而上傳圖片流程中,我們需要知道要上傳到哪個商品,所以需要該商品的編號,為了這樣的流程需求,我們會預先建立一筆僅有主鍵資料的商品資料,允許商品一開始其他的資料為空值的狀態

為了避免資料不完整的商品上架,讓使用者可以購買,在預先建立商品時,商品的狀態預設為建立中(C),所以使用者無法直接購買該項商品,直到該商品狀態被變更為可販售(S),使用者才可以購買該商品。而在品狀態為可販售(S)時,我們就要確保資料的正確及完整性才可允許販售。

交易記錄資料表

交易記錄資料表(transaction)欄位設計

說明 欄位名稱 欄位屬性
交易編號 id Integer
使用者編號 user_id Integer
商品編號 merchandise_id Integer
當時購買單價 price Integer
購買數量 buy_count Integer
交易總價格 total_price Integer
建立時間 created_at DateTime
更新時間 updated_at DateTime

交易記錄資料表(transaction) 的Migration

database\migrations\ 2019_08_16_084029_create_transaction_table.php

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTransactionTable extends Migration
{
    //執行資料庫異動
    public function up()
    {
        Schema::create('transaction', function (Blueprint $table) {
            //交易編號
            $table->bigIncrements('id');
            //使用者編號
            $table->integer('user_id');
            //商品編號
            $table->integer('merchandise_id');
            //當時購買單價
            $table->integer('price');
            //購買數量
            $table->integer('buy_count');
            //交易總價格
            $table->integer('total_price');
            //時間戳記
            $table->timestamps();

            //索引設定
            $table->index(['user_id'], 'user_transaction_idx');
        });
    }

    //復原資料庫異動
    public function down()
    {
        Schema::dropIfExists('transaction');
    }
}

新增使用者生日的Migration

database\migrations\2019_08_16_084149_add_birthday_to_users_table.php

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddBirthdayToUserTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            //生日
            $table->date('birthday')->default('0001-01-01');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            //
        });
    }
}

上一篇
[Day 18] Laravel實作 - 資料庫設定及建立(三)
下一篇
[Day 20] Laravel實作 - 資料庫設定及建立(五)
系列文
Laravel從入門到放棄…………原生PHP (疑?47

尚未有邦友留言

立即登入留言